OLE DB プロバイダを使用するための分布統計情報の要件
分散クエリの最適化を強化するために、SQL Server では OLE DB プロバイダが公開する行セットまたはテーブルに関する分布統計情報を報告するために使用できる、OLE DB 仕様の拡張機能を定義しています。これらの拡張機能は SQL Server のドキュメントで定義されていますが、その情報を SQL Server で利用可能にする必要がある場合、OLE DB プロバイダの開発者は作成するプロバイダに拡張機能のサポートを組み込む必要があります。プロバイダに拡張機能のサポートが組み込まれている場合、SQL Server は拡張機能を使用して分散クエリのパフォーマンスを最適化できます。プロバイダが拡張機能をサポートしない場合、SQL Server は分布統計情報の単純な算出を使用します。
注意 |
---|
MicrosoftSQL Server Native Client OLE DB プロバイダと Microsoft OLE DB Provider for Oracle では、分布統計情報がサポートされます。 |
分布統計情報の拡張機能は、統計情報という単位に基づいて作成されます。各テーブルは 0 個以上の統計情報を持つことができ、各統計情報は 1 つ以上の列のデータを報告します。統計情報には次の情報が記録されます。
統計情報でカバーされる各列内の値の基数、つまり一意値の数。
統計情報でカバーされるすべての列の連結値の基数。
必要に応じて、統計情報でカバーされる先頭の列内のキー値のさまざまな範囲に関する情報を報告するヒストグラム。報告される値には、各キー範囲の行数、各キー範囲の一意値の数、キー値が範囲内の最高値以下のテーブル内の行数などがあります。
次にテーブル例を示します。
ColumnA |
ColumnB |
---|---|
'abc' |
'xyz' |
'abc' |
'xyz' |
'def' |
'xyz' |
'mno' |
'xyz' |
'mno' |
'mmm' |
'tuv' |
'xyz' |
ColumnA と ColumnB をカバーする統計情報では、2 つの列の結合値の基数は 5 です。つまり、ColumnA と ColumnB の値には、5 つの一意値の組み合わせがあります。これは、最初の 2 つの行が同じ結合値 ('abc' + 'xyz') を持っているためです。
ColumnA だけの基数は 4 で、ColumnB だけの基数は 2 です。ColumnA では単純な 4 区間のヒストグラムが報告されます。
値の範囲 |
範囲のテーブル行の割合 (% 単位) |
---|---|
'aaa' から 'hzz' まで |
50% |
'iaa' から 'nzz' まで |
33% |
'oaa' から 'rzz' まで |
00% |
'taa' から 'zzz' まで |
17% |
列の異なる組み合わせに関するさまざまな OLE DB データ ソース レコードの分布統計情報、および OLE DB プロバイダにより報告された一連の統計情報は、実装で定義されます。たとえば、SQL Server Version 6.5 以前では、インデックスによってカバーされている列に対してのみ分布統計情報が作成され、テーブル上で定義されたインデックスごとに 1 つ統計情報を持ちます。SQL Server Version 7.0 以降では、次の統計情報が作成されます。
テーブルで定義された各インデックスに 1 つの統計情報。
各 CREATE STATISTIC ステートメントに 1 つの統計情報。
自動生成された各統計情報に 1 つの統計情報。
述語引数で指定された特定の値に少数の行が返されることが多い場合、列は選択度が高いことになります。分布統計情報を使用すると、選択度を算出できます。
基数の大きな列にはデータ値の数が多く、各データ値は、基数の小さい列よりも少ない数の行と一致する傾向が強くなります。
OLE DB プロバイダが列内の値の分布状況を報告するヒストグラムを提供する場合は、SQL Server オプティマイザは述語引数の特定値の選択度が良好か劣悪かを算出することもできます。
リンク サーバーの分布統計情報が良好なら、オプティマイザが分散クエリのローカル部分で効果の高い実行プランを作成するための支援にもなります。
SQL Server オプティマイザは、OLE DB プロバイダと SQL Server 間のデータ通信量を減らすために分布統計情報を使用します。たとえば、ローカル サーバー上の TableA とリンク サーバー上の TableB の間で分散結合を実行するとき、SQL Server は分布統計情報を使用してこれらの処理のどれが最も効率的かを判断できます。
非結合述語をリンク サーバーに対応させ、リンク サーバーに結合を実行させる TableA から行を送信します。
非結合述語をローカル サーバーに対応させ、ローカル サーバーで結合を実行する TableB から行を取得します。
OLE DB プロバイダが列に関する基数情報を報告しない場合は、SQL Server オプティマイザでは小さな基数が算出されます。プロバイダが統計情報の分布ヒストグラムを報告しない場合は、オプティマイザは値がテーブルの行で均等に分布しているように動作します。
SQL Server は、OLE DB プロバイダの以下の拡張機能を使用して分布統計情報を報告します。
データ ソース プロパティの DBPROP_TABLESTATISTICS は、プロバイダが分布統計情報を報告するかどうかを示します。
IDBSchemaRowset、TABLE_STATISTICS により、指定したベース テーブルで利用可能な統計情報が一覧表示されます。これには、列と行の基数が含まれます。
IOpenRowset::OpenRowset は統計情報を識別する引数を受け取ります。統計情報を指定すると、StatisticID で指定された統計情報によりカバーされる先頭列の値の分布を示す OpenRowset はヒストグラムの行セットを返します。
これらの OLE DB への拡張機能は、OLE DB Version 2.6 以降に含まれています。分布統計情報に関する上記の拡張機能の詳細については、OLE DB 2.6 の仕様を参照してください。
OLE DB プロバイダでは、分布統計情報とヒストグラムを特定するために、ベース テーブルの一部の行だけをサンプリングするパフォーマンスの強化を実装できます。これらのプロバイダは、TABLE_STATISTICS とヒストグラム行セットでテーブルのすべての値を報告する前にそれらを反映するように、基数とヒストグラム データをスケール変換する必要があります。
OLE DB プロバイダが TABLE_STATISTICS とヒストグラム行セットのデータをベース テーブルの現在の内容で最新に保つかどうかは、実装で定義されます。
注意 |
---|
リンク サーバー上のテーブルを使用している場合に最適なクエリ プランを作成するには、クエリ プロセッサがリンク サーバーのデータ分布統計情報を取得する必要があります。テーブルの列に対する権限が制限されているユーザーは、権限が不十分なために有用な統計情報の一部を取得できず、効率の悪いクエリ プランを受け取り、パフォーマンスが低下する可能性があります。リンク サーバーが SQL Server のインスタンスである場合、すべての利用可能な統計情報を取得するには、ユーザーはそのテーブルを所有しているか、リンク サーバーの固定サーバー ロール sysadmin、固定データベース ロール db_owner、または固定データベース ロール db_ddladmin のメンバである必要があります。 |