OLE DB プロバイダーを使用するための分布統計情報の要件
分散クエリの最適化を強化するために、SQL Server では OLE DB プロバイダーが公開する行セットまたはテーブルに関する分布統計情報を報告するために使用できる、OLE DB 仕様の拡張機能を定義しています。これらの拡張機能は SQL Server のドキュメントで定義されていますが、その情報を SQL Server で利用可能にする必要がある場合、OLE DB プロバイダーの開発者は作成するプロバイダーに拡張機能のサポートを組み込む必要があります。プロバイダーに拡張機能のサポートが組み込まれている場合、SQL Server は拡張機能を使用して分散クエリのパフォーマンスを最適化できます。プロバイダーが拡張機能をサポートしない場合、SQL Server は分布統計情報の単純な算出を使用します。
注 |
---|
Microsoft SQL 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 は、統計情報を識別する引数を受け取ります。統計情報を指定した場合、OpenRowset は、StatisticID で指定された統計情報によりカバーされる先頭列の値の分布を示すヒストグラムの行セットを返します。
これらの 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 のメンバーである必要があります。 |