ビューの統計情報の収集

コストベースの最適化では統計情報が必要です。ビューの統計情報の収集と保存を Virtual DataPort に指示するには以下の手順に従います。

  1. ビューを開きます。

  2. [Options] をクリックして [Statistics] タブをクリックします。

  3. [Enable statistics] をチェックします。

  4. [Complete missing statistics executing SELECT queries] をチェックすると、ビューの統計情報を収集するプロセスの実行中に Virtual DataPort サーバーによって SELECT ステートメントが実行され、データベースのシステムテーブルからは取得できない統計情報が収集されます。

    このオプションをチェックしない場合、データベースのシステムテーブルから統計情報が収集され、この SELECT ステートメントは 実行されません

    このオプションは、特定のアダプターを使用するデータソースから作成した JDBC 基本ビューでのみ使用できます。各ベンダーのデータベースのシステムテーブルから取得できる統計情報の一覧については、「 統計情報収集プロセスの動作 」を参照してください。

  5. 以下のいずれかを実行します。

    1. [Gather statistics for selected fields] をクリックした場合は、このビューの統計情報が自動的に収集され、保存されます。このプロセスが完了すると、ビューのメタデータに統計情報が保存されます。

      重要

      JDBC 基本ビューの統計情報を取得する前に、ソースデータベース (Oracle、IBM DB2 など) にこのテーブルの統計情報が存在することを確認してください。統計情報が存在しないか、古くなっている場合、収集される統計情報は正確ではなく、コストベースの最適化によって最適な実行プランが選択されない可能性があります。

      Virtual DataPort では、選択したフィールドの統計情報のみが取得されます (デフォルトではすべてのフィールドが選択されています)。

      通常は、すべてのフィールドを選択して、それらすべての統計情報を一度に取得しますが、次に挙げる状況では必ずしもそれが可能であるとは限りません。

      1. フィールドによっては、統計情報を取得できないことがあります。[Complete missing statistics executing SELECT queries] をチェックして、JDBC 基本ビューで作業していれば、 SELECT クエリが実行され、データベースのシステムテーブルからは取得できない統計情報が収集されます。

        ただし、このクエリを実行すると、データベースからエラーが返されることがあります。たとえば、クエリで blob フィールドの平均サイズを取得しようとすると、データベースによってはエラーを返すものがあります。このような場合は、エラーの原因となるフィールドのチェックボックスのチェックをはずし、他のフィールドの統計情報を取得できるようにします。

      2. 統計情報の収集で必要な関数の実行が、データベースでサポートされていないことがあります。この場合は、[Do not delegate the generation of the statistics] チェックボックスをチェックします。これにより、Virtual DataPort によって、テーブルからすべてのデータが取得され (SELECT * FROM view が実行されます)、ローカルで集計関数が実行されます。このオプションをチェックすることは、それが必要な場合を除き、推奨されません。

      3. 一度にすべてのフィールドの統計情報を取得すると、目的のデータが保持されているデータソースに過剰な負荷がかかり、その回避が必要になることがあります。その場合は、すべてのフィールドではなく、その一部の統計情報を取得することが推奨されます。

      ビューの統計情報を収集するプロセスの詳細については、「 統計情報の自動収集 」を参照してください。

    2. ビューの統計情報を手動で用意することもできますが、これまでの手順で説明したように自動的に収集することが推奨されます。ビューの統計情報を手動で用意するには、[Number of rows] に適切な値を入力し、その下のテーブルでフィールドごとに次の必要な値を入力します。

      1. 値の平均サイズ

      2. 最大値と最小値 (text 型の値は非対象)

      3. 個別の値の数

      4. NULL 値の数

Gathering the statistics of a view

ビューの統計情報の収集

コストベースのオプティマイザーでは、 blobbooleandatetextxmlarrayrecord の各型のフィールドの最大値と最小値は使用されないので、指定できなくなっています (テーブルでは、それらの型で最大値と最小値に該当するフィールドのセルは無効になっていて、ラベル [N/A] が表示されています)。

ビューの統計情報が収集された後またはユーザーによって手動で用意された後、[Enable statistics] チェックボックスのチェックをはずすことによって、ビューの統計情報を無効にすることができます。これにより、統計情報が「失われる」ことはありませんが、コストベースの最適化では、それらの統計情報が使用されなくなります。したがって、このビューの統計情報を最適化で必要とする場合、この最適化はクエリで適用されません。


複数のビューの統計情報を一度に収集することもできます。そのためには、[Tools] メニューで [Manage statistics] をクリックします。

Gathering the statistics of several views at once

複数ビューの統計情報の一括収集

このダイアログで、統計情報を取得するビューを選択して [Gather] をクリックします。フォルダーにあるすべてのビューを選択するには、そのフォルダーを選択します。

注釈

Denodo では、各ビューの [Options] ダイアログ > [Statistics] タブの設定 (ビューの [Complete missing statistics executing SELECT queries] オプションと [Do not delegate the generation of statistics] オプション) を使用してビューの統計情報が収集されます。

これらのオプションの値および基盤となるデータソースによっては、ビューの統計情報が不十分なことがあります。たとえば、JDBC 基本ビューのデフォルトの動作では、クエリを実行せずに、データベースのシステムテーブルから統計情報が取得されます。データベースによっては、この情報が不十分なことがあるので、ビューの [Complete missing statistics executing SELECT queries] オプションを有効にして、統計情報を再度収集することが必要になる場合があります (「 統計情報収集プロセスの動作 」を参照)。

したがって、想定どおりの統計情報を確実に収集できるように、このプロセスの終了後にビューの統計情報を確認することが推奨されます。

統計情報を取得済みのビュー (テーブルの [Status] 列が [On] または [Off] であるビュー) に対しては、そのビューを選択して [Enable] または [Disable] をクリックすることによって、その統計情報を有効または無効にすることができます。

統計情報が無効なビュー ([Off] ステータス) または未収集のビュー ([N/A] ステータス) の統計情報を必要とするクエリでは、コストベースの最適化が適用されません。

ビューまたはフォルダーを検索するには、このダイアログ上部にあるボックスにビューまたはフォルダーの名前を入力します。

ビューの統計情報は環境に依存することから、バージョン管理の対象になりません。

統計情報の自動収集

ここでは、コストベースの最適化で使用するビューの統計情報を自動的に収集するプロセスについて説明します。

統計情報収集プロセスの動作

ここでは、Virtual DataPort サーバーでビューの統計情報がどのように収集されるかについて説明します。

重要

JDBC 基本ビューの統計を取得する前に、ソースデータベース (Oracle、IBM DB2 など) にこのテーブルの統計が存在することを確認してください。統計が存在しないか、古くなっている場合、正確な情報が収集されず、コストベースの最適化によって次善の実行プランが選択されない可能性があります。

ビューの統計情報を収集するプロセスは、基本ビューのタイプによって次のように異なります。

  • JDBC 基本ビュー: データベースのシステムテーブルからビューの統計情報が収集されます。これらのテーブルから収集される情報は、ビューのデータソースで使用しているデータベースアダプターによって異なります。データベースによっては、そのテーブルやビューについて、他のデータベースよりも多くの統計情報が提供されることがあるからです。

    各データベースベンダーから収集できる統計情報の一覧については、表「 各ベンダーのシステムテーブルから収集される統計情報 」を参照してください。

    [Complete missing statistics executing SELECT queries] をチェックしていれば、SELECT クエリが追加で実行され、システムテーブルからは取得できない統計情報が取得されます。

  • JDBC 以外の基本ビュー: 「 Sample SQL query executed to gather statistics of a non-JDBC base view 」のようなクエリが実行され、ビューの統計情報が収集されます。ODBC ソースが関与しているビューでは、このクエリの一部をそのソースにプッシュダウンできるので、収集プロセスが高速になります。

JDBC 以外の基本ビューの統計情報を収集するために実行される SQL クエリの例
SELECT count(*),
    , avg( length( <text field> ) )
    , max( <text field> )
    , min( <text field> )
    , count( DISTINCT <text field> )
    , ...
    , max( <numeric field> )
    , min( <numeric field> )
    , count( distinct( <numeric field> ) )
    , count( <numeric field> )
    , ...
    FROM view

SELECT ステートメントで複数の集計関数を投影する処理をサポートしていないデータベースがあります。その場合は、[Gather statistics for selected fields] ボタンをクリックする前に [Do not delegate the generation of the statistics] チェックボックスをチェックしておきます。これにより、(SELECT * FROM view が実行されることで) Virtual DataPort によってテーブルからすべてのデータが取得され、集計関数がローカルで実行されます。可能であれば、このオプションのチェックは避けるようにします。チェックすると、テーブルに保存されているすべてのデータをデータベースから Virtual DataPort に送信する必要があるからです。また、これらの集計関数はデータベースで実行するほうが高速です。

他のタイプのソース (区切り形式ファイル、XML など) からデータを取得する場合、Virtual DataPort 自身によってソースからすべての行が取得され、統計情報が計算されます。データベース以外のソースからすべてのデータを取得するビューでは、[Gather statistics for selected fields] チェックボックスをチェックしているかどうかは動作に影響しません。

注釈

データベースのシステムテーブルから統計情報を収集しない場合、大規模なビューの統計情報を収集するプロセスには長時間を要することがあります。また、Virtual DataPort とデータソースの両方に過大なワークロードが発生することも考えられます。したがって、システムの負荷が高くないことが予想される時間帯に統計情報を収集することが好都合です (統計情報収集プロセスの実行スケジュールを設定する手順の詳細については、「 統計情報の収集スケジュール 」を参照)。

以下の表に、データベースのシステムテーブルからどのような統計情報が収集されるかを、データベースベンダーごとに示します。

各ベンダーのシステムテーブルから収集される統計情報

データベースアダプター

テーブルの行数

平均サイズ

最小値

最大値

個別の値の数

Null 値の数

Amazon Redshift

dot

dot

dot

dot

Azure Synapse SQL

dot

dot

dot

Cloudera Impala

dot

dot

dot

dot

Databricks

dot

dot

dot

dot

dot

dot

Greenplum

dot

dot

dot

dot

IBM DB2

dot

dot

dot

dot

dot

dot

IBM DB2 z/OS

dot

dot

dot

dot

Microsoft SQL Server

dot

dot

dot

Netezza

dot

dot

Oracle

dot

dot

dot

dot

dot

dot

PostgreSQL

dot

dot

dot

dot

PrestoDB/PrestoSQL (*)

dot

dot

dot

dot

dot

Spark 2.x

dot

dot

dot

dot

dot

dot

Teradata

dot

dot

Vertica

dot

(*): PrestoDB/PrestoSQL アダプターでは、PrestoDB/PrestoSQL バージョン 183 以降で、システムテーブルからデフォルトで統計情報を取得できますが、それよりも前の旧バージョンでは取得できません。PrestoDB/PrestoSQL の旧バージョンで取得できるようにするには、以下の手順に従います。

  1. 接続している PrestoDB/PrestoSQL のバージョンを取得します。

  2. 管理者としてログインして、VQL シェルから以下のコマンドを実行します。

    SET 'com.denodo.vdb.contrib.storedprocedure.GenerateStatsProcedure.presto.statsversion' = '<value>';
    

    <value> には以下の値を指定します。

    • pre_177: PrestoDB/PrestoSQL のバージョンが 176 以前の場合。これらのバージョンでは、システムテーブルに統計情報が用意されていません。

    • post_177: バージョンが 177 以降で 183 より前である場合。これらのバージョンでは、システムテーブルから行数、個別の値の数、および NULL 値の数の各統計情報が得られますが、最小値と最大値は得られません。

    • post_183 (デフォルト値): バージョンが 183 以降である場合。これらのバージョンでは、上記の表にある統計情報がシステムテーブルから得られます。

  3. 使用する管理ツールをインストールする際、 <DENODO_HOME>/conf/vdp-admin/VDBAdminConfiguration.properties ファイルを編集して、以下のプロパティを追加します。

    com.denodo.vdb.contrib.storedprocedure.GenerateStatsProcedure.presto.statsversion=<version>
    

    <version> を、前の手順で設定した値に置き換えます。

  4. Virtual DataPort サーバーとその管理ツールを再起動します。


この表にないベンダーを使用している場合は、「 JDBC 以外の基本ビューの統計情報を収集するために実行される SQL クエリの例 」のような SELECT クエリを発行することによって統計情報を取得します。


以下の表に、上の表に記載されている統計情報を取得するために、Virtual DataPort によるクエリの実行対象となるテーブルまたは Virtual DataPort によって実行されるステートメントまたは関数を示します。これらは、統計情報を取得する場所であるデータベースによって異なります。

統計情報を取得するために Virtual DataPort によって実行されるテーブル、ステートメント、または関数

データベースアダプター

統計情報を取得するために調査対象となるエレメント

Amazon Redshift

システムテーブル: PG_STATS、PG_CLASS と PG_NAMESPACE、PG_INHERITS

Azure Synapse SQL

システムテーブル: SYS.OBJECTS、SYS.PARTITIONS、SYS.STATS、SYS.STATS_COLUMNS

Cloudera Impala

ステートメント: SHOW COLUMN STATS および SHOW TABLE STATS

Databricks

ステートメント: DESCRIBE EXTENDED

Greenplum

システムテーブル: PG_STATS、PG_CLASS と PG_NAMESPACE、PG_INHERITS

IBM DB2 (*)

システムテーブル: SYSCAT.COLUMNS および SYSCAT.TABLES

Microsoft SQL Server

システムテーブル: SYS.OBJECTS、SYS.PARTITIONS、SYS.STATS、SYS.STATS_COLUMNS

Netezza

システムテーブル: _V_RELATION_COLUMN_XDB および _V_TABLE_XDB

Oracle 9i

システムテーブル: ALL_TAB_COLUMNS および ALL_ALL_TABLES

Oracle 9i 以降

システムテーブル: ALL_TAB_COLUMNS および ALL_TAB_STATISTICS

PostgreSQL

システムテーブル: PG_STATS、PG_CLASS と PG_NAMESPACE、PG_INHERITS

PrestoDB/PrestoSQL

ステートメント: SHOW STATS

Spark 2.x

ステートメント: DESCRIBE EXTENDED

Teradata

ステートメント: HELP STATISTICS

Vertica

関数: APPROXIMATE_COUNT_DISTINCT

以下の型のフィールドの統計情報は 収集されません

  • blob

  • boolean

  • xml

  • array

  • register.

  • ソース型プロパティが以下のいずれかであるフィールド

    • BIT

    • CLOB

    • LONGVARCHAR

    • LONGNVARCHAR

これらのいくつかの型のフィールドには、他の統計情報から推定された値が設定されます。たとえば、 blobarray 、および register の各フィールドの場合、それぞれの値は互いに異なると想定されます。したがって、統計情報の「個別の値の数」はビューにある行の数に等しくなります。

コストベースのオプティマイザーでは、 blobbooleandatetextxmlarrayrecord の各型のフィールドの最大値と最小値は使用されません。したがって、ビューの統計情報テーブルでは、それらの型で最大値と最小値に該当するフィールドのセルは無効になっていて、ラベル [N/A] が表示されています。

統計情報の収集スケジュール

GENERATE_STATS は、ビューの統計情報を収集して保存するストアドプロシージャです。ビューの統計情報の収集スケジュールを設定するには、Denodo Scheduler を使用します。このツールの主な目的は、システムの負荷が高くないことが予想される時間帯に統計情報を収集することにあります。

この手順の詳細については、『VQL ガイド』の「 GENERATE_STATS 」を参照してください。

統計情報収集プロセスの制限事項

統計情報収集プロセスには、いくつかの制限事項があります。これらの制限事項に該当する場合、その影響を受けるフィールドの統計情報を手動で指定できます。

  • データベースによっては、上記のリストにない型に Virtual DataPort によってマッピングされるデータ型であっても、そのデータ型のフィールドの統計情報が取得されないことがあります。具体的には以下のとおりです。

    • IBM DB2 では、 LONGVARCHAR データ型と LONGVARGRAPHIC データ型のテーブルフィールドの統計情報が収集されません。

    • Microsoft SQL Server では、 TEXT データ型と NTEXT データ型のテーブルフィールドの統計情報が収集されません。

    • Oracle では、 CLOBNCLOB 、および SQLXML の各データ型のテーブルフィールドの統計情報が収集されません。

    • Spark では、バイナリ型と文字列型の最小値と最大値の各メトリックが存在しません。

  • Informix 7.x からデータを取得するビューでは、統計情報を収集する前に [Do not delegate the generation of statistics] チェックボックスをチェックします。最近のバージョンの Informix では、 INTERVAL 型のフィールドがあるテーブルの統計情報は収集できません。

  • SQL Server の場合、 UNIQUEIDENTIFIER 型または SQLVARIANT 型のフィールドがあるテーブルの統計情報は収集できません。

  • 必須フィールドがあるビューの統計情報は収集できません。