DBCC SHOW_STATISTICS (Transact-SQL)

DBCC SHOW_STATISTICS では、テーブルまたはインデックス付きビューについての、現在のクエリの最適化に関する統計を表示します。クエリ オプティマイザーでは、統計を使用してクエリ結果の基数や行数を推定することで、高品質のクエリ プランを作成できます。たとえば、クエリ オプティマイザーでは、基数の推定に基づいて、クエリ プランで Index Scan 操作ではなく Index Seek 操作が使用される場合があります。この場合、リソースを大量に消費する Index Scan 操作を使用しないようにすることでパフォーマンスが向上します。

クエリ オプティマイザーでは、テーブルまたはインデックス付きビューの統計を統計オブジェクトに格納します。テーブルの場合、インデックスまたはテーブル列のリストに関する統計オブジェクトが作成されます。統計オブジェクトには、統計に関するメタデータが含まれるヘッダー、統計オブジェクトの最初のキー列の値の分布が含まれるヒストグラム、および列間の相関関係を測定する密度ベクトルが格納されています。データベース エンジンでは、統計オブジェクトの任意のデータを使用して基数の推定を計算できます。

DBCC SHOW_STATISTICS では、統計オブジェクトに格納されたデータに基づくヘッダー、ヒストグラム、および密度ベクトルを表示します。この構文では、テーブルまたはインデックス付きビューを指定するときに、対象のインデックス名、統計名、または列名も指定することができます。このトピックでは、統計の表示方法と表示される結果の意味について説明します。

詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target ) 
[ WITH [ NO_INFOMSGS ] < option > [ , n ] ]
< option > :: =
    STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM

引数

  • table_or_indexed_view_name
    統計情報を表示するテーブルまたはインデックス付きビューの名前。

  • target
    統計情報を表示するインデックス、統計、または列の名前。target がテーブルまたはインデックス付きビューの既存のインデックスまたは統計の名前である場合は、その target に関する統計情報が返されます。target が既存の列の名前であり、自動的に作成された統計がその列にある場合は、その自動作成された統計に関する情報が返されます。target 列に自動的に作成された統計が存在しない場合は、エラー メッセージ 2767 が返されます。

  • NO_INFOMSGS
    重大度レベル 0 ~ 10 のすべての情報メッセージを表示しないようにします。

  • STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM [ **,**n ]
    これらのオプションを 1 つ以上指定すると、ステートメントによって返される結果セットが、指定のオプションに合わせて制限されます。オプションを指定しないと、すべての統計情報が返されます。

    STATS_STREAM は単に情報を示すためだけに特定されます。サポートされていません。将来の互換性は保証されません。

結果セット

次の表は、STAT_HEADER を指定した場合に結果セットに返される列を示しています。

列名

説明

Name

統計オブジェクトの名前。

Updated

統計情報が最後に更新された日付と時刻。STATS_DATE 関数でこの情報を取得することもできます。

Rows

統計情報が最後に更新された時点のテーブルまたはインデックス付きビューの行の総数。統計がフィルター選択されている場合、またはフィルター選択されたインデックスに対応している場合は、行数がテーブルの行数よりも少なくなることがあります。詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

Rows Sampled

統計の計算時にサンプリングされた行の合計数。Rows Sampled < Rows の場合、表示されるヒストグラムおよび密度の結果は、サンプリングされた行に基づいて推定されます。

Steps

ヒストグラムの区間の数。各区間の範囲には、上限の列値までの列値の範囲が含まれます。ヒストグラムの区間は、統計の最初のキー列に基づいて定義されます。区間の最大数は 200 です。

Density

ヒストグラムの境界値を除く、統計オブジェクトの最初のキー列のすべての値について、"1 / 個別の値の数" として計算されます。この Density の値はクエリ オプティマイザーでは使用されません。SQL Server 2008 より前のバージョンとの互換性を維持するために表示されます。

Average Key Length

統計オブジェクトのすべてのキー列の、値ごとの平均バイト数。

String Index

Yes の場合は、統計オブジェクトに文字列の統計概要が含まれています。これにより、LIKE 演算子を使用するクエリ述語 (WHERE ProductName LIKE '%Bike' など) に対する基数の推定が向上します。文字列の統計概要は、ヒストグラムとは別に格納されます。この統計は、統計オブジェクトの最初のキー列について、その型が char、varchar、nchar、nvarchar、varchar(max)、nvarchar(max)、text、または ntext. の場合に作成されます。

Filter Expression

統計オブジェクトに含まれるテーブル行のサブセットの述語。NULL = フィルター選択されていない統計情報です。フィルター選択された述語の詳細については、「フィルター選択されたインデックスのデザイン ガイドライン」を参照してください。フィルター選択された統計情報の詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

Unfiltered Rows

フィルター式を適用する前のテーブル内の行の合計数。Filter Expression が NULL の場合、Unfiltered Rows は Rows と同じになります。

次の表は、DENSITY_VECTOR を指定した場合に結果セットに返される列を示しています。

列名

説明

All Density

密度は "1 / 個別の値の数" です。結果には、統計オブジェクトの列の各プレフィックスに対する密度が、密度ごとに 1 行表示されます。個別の値は、行および列プレフィックスごとの列値の個別のリストです。たとえば、統計オブジェクトにキー列 (A, B, C) が含まれる場合、結果では列プレフィックス (A)、(A, B)、および (A, B, C) ごとに個別の値リストの密度が報告されます。プレフィックス (A, B, C) を使用すると、これらの各リストは個別の値リスト (3, 5, 6)、(4, 4, 6)、(4, 5, 6)、(4, 5, 7) のようになります。プレフィックス (A, B) を使用すると、同じ列値の個別の値リストが (3, 5)、(4, 4)、および (4, 5) になります。

Average Length

列プレフィックスの列値のリストを格納する平均の長さ (バイト単位)。たとえば、リスト (3, 5, 6) の値ごとに 4 バイト必要な場合は、長さは 12 バイトになります。

Columns

All density および Average length を表示するプレフィックスの列の名前。

次の表は、HISTOGRAM オプションを指定した場合に結果セットに返される列を示しています。

列名

説明

RANGE_HI_KEY

ヒストグラム区間の上限の列値。この列値はキー値とも呼ばれます。

RANGE_ROWS

ヒストグラム区間内 (上限は除く) に列値がある行の予測数。

EQ_ROWS

ヒストグラム区間の上限と列値が等しい行の予測数。

DISTINCT_RANGE_ROWS

ヒストグラム区間内 (上限は除く) にある個別の列値を持つ行の予測数。

AVG_RANGE_ROWS

ヒストグラム区間内 (上限は除く) にある重複する列値を持つ行の平均数 (DISTINCT_RANGE_ROWS > 0 の場合 RANGE_ROWS / DISTINCT_RANGE_ROWS)

説明

ヒストグラム

ヒストグラムでは、データセットの個別の値ごとに出現頻度を測定します。クエリ オプティマイザーでは、統計オブジェクトの最初のキー列の列値に基づいてヒストグラムを計算し、行を統計的にサンプリングするかテーブルまたはビュー内のすべての行でフル スキャンを実行することによって列値を選択します。サンプリングされた行のセットからヒストグラムを作成する場合、格納される行の総数および個別の値の数は推定値であり、必ずしも整数にはなりません。

ヒストグラムを作成するには、クエリ オプティマイザーで列値を並べ替え、個別の列値ごとに一致する値の数を計算し、列値を最大 200 の連続したヒストグラム区間に集計します。各区間には、上限の列値までの列値の範囲が含まれます。この範囲には、境界値の間 (境界値自体は除く) のすべての有効な列値が含まれます。格納される最小の列値は、最初のヒストグラム区間の上限境界値になります。

次の図は、6 つの区間があるヒストグラムを示しています。最初の上限境界値の左側にある領域が最初の区間です。

6 ステップのヒストグラム

ヒストグラムの各区間は、以下のように表されます。

  • 太線は、上限境界値 (RANGE_HI_KEY) およびその出現回数 (EQ_ROWS) を表します。

  • RANGE_HI_KEY の左にある領域は、列値の範囲、およびそれぞれの列値の平均出現回数 (AVG_RANGE_ROWS) を表します。最初のヒストグラム区間の AVG_RANGE_ROWS は常に 0 です。

  • 点線は、範囲内にある個別の値の総数 (DISTINCT_RANGE_ROWS) および範囲内の値の総数 (RANGE_ROWS) を推定するために使用されるサンプリングされた値を表します。クエリ オプティマイザーでは、RANGE_ROWS および DISTINCT_RANGE_ROWS を使用して AVG_RANGE_ROWS を計算します。サンプリングされた値は格納されません。

クエリ オプティマイザーでは、統計的有意性に応じてヒストグラム区間を定義します。区間幅を最大にするアルゴリズムを使用して境界値の差を最大にし、ヒストグラムの区間の数を最小限に抑えます。区間の最大数は 200 です。ヒストグラムの区間の数は、境界点が 200 より少ない列でも、個別の値の数より少なくなることがあります。たとえば、個別の値が 100 個ある列のヒストグラムの境界点が 100 より少なくなる場合もあります。

密度ベクトル

クエリ オプティマイザーでは、同一のテーブルまたはインデックス付きビューから複数の列を返すクエリに対する基数の推定を向上させるために密度を使用します。密度ベクトルには、統計オブジェクトの列のプレフィックスごとに 1 つの密度が格納されます。たとえば、統計オブジェクトに CustomerId、ItemId、Price というキー列がある場合、以下の列プレフィックスごとに密度が計算されます。

列プレフィックス

密度の計算対象

(CustomerId)

CustomerId の値が一致する行

(CustomerId, ItemId)

CustomerId および ItemId の値が一致する行

(CustomerId, ItemId, Price)

CustomerId、ItemId、および Price の値が一致する行

制限事項

DBCC SHOW_STATISTICS では、空間インデックスの統計情報は提供されません。

権限

統計オブジェクトを表示するには、テーブルを所有しているか、固定サーバー ロール sysadmin、固定データベース ロール db_owner、または固定データベース ロール db_ddladmin のメンバーである必要があります。

A. すべての統計情報を返す

次の例は、Person.Address テーブルの AK_Product_Name インデックスに関するすべての統計情報を表示します。

USE AdventureWorks2008R2;
GO
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);
GO

B. HISTOGRAM オプションを指定する

次の例では、AK_Product_Name インデックスに関して表示する統計情報を HISTOGRAM データに制限します。

USE AdventureWorks2008R2;
GO
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid) WITH HISTOGRAM;
GO