ビューの統計情報の収集¶
コストベースの最適化では統計情報が必要です。ビューの統計情報の収集と保存を Virtual DataPort に指示するには以下の手順に従います。
ビューを開きます。
[Options] をクリックして [Statistics] タブをクリックします。
[Enable statistics] をチェックします。
[Complete missing statistics executing SELECT queries] をチェックすると、ビューの統計情報を収集するプロセスの実行中に Virtual DataPort サーバーによって
SELECT
ステートメントが実行され、データベースのシステムテーブルからは取得できない統計情報が収集されます。このオプションをチェックしない場合、データベースのシステムテーブルから統計情報が収集され、この SELECT ステートメントは 実行されません 。
このオプションは、特定のアダプターを使用するデータソースから作成した JDBC 基本ビューでのみ使用できます。各ベンダーのデータベースのシステムテーブルから取得できる統計情報の一覧については、「 統計情報収集プロセスの動作 」を参照してください。
以下のいずれかを実行します。
[Gather statistics for selected fields] をクリックして、このビューの統計情報を収集します。プロセスが完了すると、取得した値が統計フォームに入力されます。ビューの他の変更と同じく、保存ボタンをクリックすれば、この値を保存できます。
重要
JDBC 基本ビューの統計情報を取得する前に、ソースデータベース (Oracle、IBM DB2 など) にこのテーブルの統計情報が存在することを確認してください。統計情報が存在しないか、古くなっている場合、収集される統計情報は正確ではなく、コストベースの最適化によって最適な実行プランが選択されない可能性があります。
Virtual DataPort では、選択したフィールドの統計情報のみが取得されます (デフォルトではすべてのフィールドが選択されています)。
通常は、すべてのフィールドを選択して、それらすべての統計情報を一度に取得しますが、次に挙げる状況では必ずしもそれが可能であるとは限りません。
フィールドによっては、統計情報を取得できないことがあります。[Complete missing statistics executing SELECT queries] をチェックして、JDBC 基本ビューで作業していれば、
SELECT
クエリが実行され、データベースのシステムテーブルからは取得できない統計情報が収集されます。ただし、このクエリを実行すると、データベースからエラーが返されることがあります。たとえば、クエリで blob フィールドの平均サイズを取得しようとすると、データベースによってはエラーを返すものがあります。このような場合は、エラーの原因となるフィールドのチェックボックスのチェックをはずし、他のフィールドの統計情報を取得できるようにします。
一度にすべてのフィールドの統計情報を取得すると、目的のデータが保持されているデータソースに過剰な負荷がかかり、その回避が必要になることがあります。その場合は、すべてのフィールドではなく、その一部の統計情報を取得することが推奨されます。
ビューの統計情報を収集するプロセスの詳細については、「 統計情報の自動収集 」を参照してください。
ビューの統計情報を手動で用意することもできますが、これまでの手順で説明したように自動的に収集することが推奨されます。ビューの統計情報を手動で用意するには、[Number of rows] に適切な値を入力し、その下のテーブルでフィールドごとに次の必要な値を入力します。
値の平均サイズ
最大値と最小値 (
text
型の値は非対象)個別の値の数
NULL
値の数
コストベースのオプティマイザーでは、 blob
、 boolean
、 date
、 text
、 xml
、 array
、 record
の各型のフィールドの最大値と最小値は使用されないので、指定できなくなっています (テーブルでは、それらの型で最大値と最小値に該当するフィールドのセルは無効になっていて、ラベル [N/A] が表示されています)。
ビューの統計情報が収集された後またはユーザーによって手動で用意された後、[Enable statistics] チェックボックスのチェックをはずすことによって、ビューの統計情報を無効にすることができます。これにより、統計情報が「失われる」ことはありませんが、コストベースの最適化では、それらの統計情報が使用されなくなります。したがって、このビューの統計情報を最適化で必要とする場合、この最適化はクエリで適用されません。
複数のビューの統計情報を一度に収集することもできます。そのためには、[Tools] メニュー > [Query optimizations] > [Manage statistics] をクリックします。
このダイアログで、統計情報を取得するビューを選択して [Gather] をクリックします。フォルダにあるすべてのビューを選択するには、そのフォルダを選択します。
注釈
Denodo では、各ビューの [Options] ダイアログ > [Statistics] タブの設定 (ビューの [Complete missing statistics executing SELECT queries] オプション) を使用してビューの統計情報が収集されます。
これらのオプションの値および基盤となるデータソースによっては、ビューの統計情報が不十分なことがあります。たとえば、JDBC 基本ビューのデフォルトの動作では、クエリを実行せずに、データベースのシステムテーブルから統計情報が取得されます。データベースによっては、この情報が不十分なことがあるので、ビューの [Complete missing statistics executing SELECT queries] オプションを有効にして、統計情報を再度収集することが必要になる場合があります (「 統計情報収集プロセスの動作 」を参照)。
したがって、想定どおりの統計情報を確実に収集できるように、このプロセスの終了後にビューの統計情報を確認することが推奨されます。
統計情報を取得済みのビュー (テーブルの [Status] 列が [On] または [Off] であるビュー) に対しては、そのビューを選択して [Enable] または [Disable] をクリックすることによって、その統計情報を有効または無効にすることができます。
統計情報が無効なビュー ([Off] ステータス) または未収集のビュー ([N/A] ステータス) の統計情報を必要とするクエリでは、コストベースの最適化が適用されません。
ビューまたはフォルダを検索するには、このダイアログ上部にあるボックスにビューまたはフォルダの名前を入力します。
ビューの統計情報は環境に依存することから、バージョン管理の対象になりません。
統計情報の自動収集¶
ここでは、コストベースの最適化で使用するビューの統計情報を自動的に収集するプロセスについて説明します。
収集プロセスの動作については、「 統計情報収集プロセスの動作 」を参照してください。
Denodo Scheduler を使用して定期的に統計情報を収集および更新する手順については、「 統計情報の収集スケジュール 」を参照してください。
現時点における収集プロセスの制限事項については、「 統計情報収集プロセスの制限事項 」を参照してください。
統計情報収集プロセスの動作¶
ここでは、Virtual DataPort サーバーでビューの統計情報がどのように収集されるかについて説明します。
重要
JDBC 基本ビューの統計を取得する前に、ソースデータベース (Oracle、IBM DB2 など) にこのテーブルの統計が存在することを確認してください。統計が存在しないか、古くなっている場合、正確な情報が収集されず、コストベースの最適化によって次善の実行プランが選択されない可能性があります。
ビューの統計情報を収集するプロセスは、基本ビューのタイプによって次のように異なります。
JDBC 基本ビュー: データベースのシステムテーブルからビューの統計情報が収集されます。これらのテーブルから収集される情報は、ビューのデータソースで使用しているデータベースアダプターによって異なります。データベースによっては、そのテーブルやビューについて、他のデータベースよりも多くの統計情報が提供されることがあるからです。
各データベースベンダーから収集できる統計情報の一覧については、表「 各ベンダーのシステムテーブルから収集される統計情報 」を参照してください。
[Complete missing statistics executing SELECT queries] をチェックしていれば、SELECT クエリが追加で実行され、システムテーブルからは取得できない統計情報が取得されます。
オブジェクトストレージのエレメントに対して作成されたビュー (「 Parquet 形式のオブジェクトストレージデータ 」) の場合、Virtual DataPort では組み込み MPP の統計情報も計算します。
この収集プロセスは、クエリから作成した JDBC 基本ビューと、ストアドプロシージャで作成した JDBC 基本ビューには適用されません。この 2 つについては、JDBC 以外の基本ビューと同様の方法で統計情報を収集します。
JDBC 以外の基本ビュー: 「 Sample SQL query executed to gather statistics of a non-JDBC base view 」のようなクエリが実行され、ビューの統計情報が収集されます。ODBC ソースが関与しているビューでは、このクエリの一部をそのソースにプッシュダウンできるので、収集プロセスが高速になります。
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
他のタイプのソース (区切り形式ファイル、XML など) からデータを取得する場合、Virtual DataPort 自身によってソースからすべての行が取得され、統計情報が計算されます。データベース以外のソースからすべてのデータを取得するビューでは、[Gather statistics for selected fields] チェックボックスをチェックしているかどうかは動作に影響しません。
注釈
データベースのシステムテーブルから統計情報を収集しない場合、大規模なビューの統計情報を収集するプロセスには長時間を要することがあります。また、Virtual DataPort とデータソースの両方に過大なワークロードが発生することも考えられます。したがって、システムの負荷が高くないことが予想される時間帯に統計情報を収集することが好都合です (統計情報収集プロセスの実行スケジュールを設定する手順の詳細については、「 統計情報の収集スケジュール 」を参照)。
以下の表に、データベースのシステムテーブルからどのような統計情報が収集されるかを、データベースベンダーごとに示します。
データベースアダプター |
テーブルの行数 |
平均サイズ |
最小値 |
最大値 |
個別の値の数 |
Null 値の数 |
---|---|---|---|---|---|---|
Amazon Redshift |
||||||
Azure Synapse SQL |
||||||
ClickHouse |
||||||
Cloudera Impala |
||||||
Databricks |
||||||
Exasol |
||||||
Greenplum |
||||||
Hive |
||||||
IBM DB2 |
||||||
IBM DB2 z/OS |
||||||
Microsoft SQL Server |
||||||
Netezza |
||||||
Oracle |
||||||
PostgreSQL |
||||||
PrestoDB/Trino (*) |
||||||
SAP HANA |
||||||
Spark 2.x |
||||||
SQreamDB |
||||||
Teradata (**) |
||||||
Vertica |
(*): PrestoDB/Trino アダプターでは、PrestoDB/Trino バージョン 183 以降で、システムテーブルからデフォルトで統計情報を取得できますが、それよりも前の旧バージョンでは取得できません。PrestoDB/Trino の旧バージョンで取得できるようにするには、以下の手順に従います。
接続している PrestoDB/Trino のバージョンを取得します。
管理者としてログインして、VQL シェルから以下のコマンドを実行します。
SET 'com.denodo.vdb.contrib.storedprocedure.GenerateStatsProcedure.presto.statsversion' = '<value>';
<value> には以下の値を指定します。
pre_177
: PrestoDB/Trino のバージョンが 176 以前の場合。これらのバージョンでは、システムテーブルに統計情報が用意されていません。post_177
: バージョンが 177 以降で 183 より前である場合。これらのバージョンでは、システムテーブルから行数、個別の値の数、および NULL 値の数の各統計情報が得られますが、最小値と最大値は得られません。post_183
(デフォルト値): バージョンが 183 以降である場合。これらのバージョンでは、上記の表にある統計情報がシステムテーブルから得られます。
使用する管理ツールをインストールする際、
<DENODO_HOME>/conf/vdp-admin/VDBAdminConfiguration.properties
ファイルを編集して、以下のプロパティを追加します。com.denodo.vdb.contrib.storedprocedure.GenerateStatsProcedure.presto.statsversion=<version>
<version> を、前の手順で設定した値に置き換えます。
Virtual DataPort サーバーとその管理ツールを再起動します。
(**): Teradata 13 以前のバージョンでは、取得できるのは「行数」と「個別の値の数」のみです。
この表にないベンダーを使用している場合は、「 JDBC 以外の基本ビューの統計情報を収集するために実行される SQL クエリの例 」のような SELECT
クエリを発行することによって統計情報を取得します。
以下の表に、上の表に記載されている統計情報を取得するために、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 |
ClickHouse |
関数: uniq System tables: system.tables |
Cloudera Impala |
ステートメント: SHOW COLUMN STATS および SHOW TABLE STATS |
Databricks |
ステートメント: DESCRIBE EXTENDED |
Exasol |
システムテーブル: $EXA_COLUMN_STATISTICS |
Greenplum |
システムテーブル: PG_STATS、PG_CLASS と PG_NAMESPACE、PG_INHERITS |
Hive |
ステートメント: DESCRIBE FORMATTED |
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/Trino |
ステートメント: SHOW STATS |
SAP HANA 1.0 と 2.0 |
システムテーブル: SYS.M_DATA_STATISTICS |
Spark 2.x |
ステートメント: DESCRIBE EXTENDED |
SQreamDB |
システムテーブル: SQREAM_CATALOG.COLUMNS |
Teradata |
ステートメント: HELP STATISTICS と SHOW STATS VALUES システムテーブル: DBC.STATSV |
Vertica |
関数: APPROXIMATE_COUNT_DISTINCT |
以下の型のフィールドの統計情報は 収集されません 。
blob
boolean
xml
array
register
.ソース型プロパティが以下のいずれかであるフィールド
BIT
CLOB
LONGVARCHAR
LONGNVARCHAR
これらのいくつかの型のフィールドには、他の統計情報から推定された値が設定されます。たとえば、 blob
、 array
、および register
の各フィールドの場合、それぞれの値は互いに異なると想定されます。したがって、統計情報の「個別の値の数」はビューにある行の数に等しくなります。
コストベースのオプティマイザーでは、 blob
、 boolean
、 date
、 text
、 xml
、 array
、 record
の各型のフィールドの最大値と最小値は使用されません。したがって、ビューの統計情報テーブルでは、それらの型で最大値と最小値に該当するフィールドのセルは無効になっていて、ラベル [N/A] が表示されています。
統計情報の収集スケジュール¶
GENERATE_STATS
は、ビューの統計情報を収集して保存するストアドプロシージャです。ビューの統計情報の収集スケジュールを設定するには、Denodo Scheduler を使用します。このツールの主な目的は、システムの負荷が高くないことが予想される時間帯に統計情報を収集することにあります。
この手順の詳細については、『VQL ガイド』の「 GENERATE_STATS 」を参照してください。
統計情報収集プロセスの制限事項¶
統計情報収集プロセスには、いくつかの制限事項があります。これらの制限事項に該当する場合、その影響を受けるフィールドの統計情報を手動で指定できます。
データベースによっては、上記のリストにない型に Virtual DataPort によってマッピングされるデータ型であっても、そのデータ型のフィールドの統計情報が取得されないことがあります。具体的には以下のとおりです。
IBM DB2 では、
LONGVARCHAR
データ型とLONGVARGRAPHIC
データ型のテーブルフィールドの統計情報が収集されません。Microsoft SQL Server では、
TEXT
データ型とNTEXT
データ型のテーブルフィールドの統計情報が収集されません。Oracle では、
CLOB
、NCLOB
、およびSQLXML
の各データ型のテーブルフィールドの統計情報が収集されません。Spark では、バイナリ型と文字列型の最小値と最大値の各メトリックが存在しません。
後続バージョンの Informix では、
INTERVAL
型のフィールドがあるテーブルから統計情報を収集することはできません。SQL Server の場合、
UNIQUEIDENTIFIER
型またはSQLVARIANT
型のフィールドがあるテーブルの統計情報は収集できません。必須フィールドがあるビューの統計情報は収集できません。