DBCC SHOW_STATISTICS(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

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

Query Optimizer では、テーブルまたはインデックス付きビューの統計を統計オブジェクトに格納します。 テーブルの場合、インデックスまたはテーブル列のリストに関する統計オブジェクトが作成されます。 統計オブジェクトには、統計に関するメタデータが含まれるヘッダー、統計オブジェクトの最初のキー列の値の分布が含まれるヒストグラム、および列間の相関関係を測定する密度ベクトルが格納されています。 データベース エンジンでは、統計オブジェクトの任意のデータを使用してカーディナリティ推定値を計算できます。 詳細については、「統計」および「カーディナリティ推定 (SQL Server)」を参照してください。

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

SQL Server の過去のバージョンでの重要な更新プログラム:

  • SQL Server 2012 (11.x) Service Pack 1 以降では、非増分統計の統計オブジェクトに含まれるヘッダー情報をプログラムで取得するために、sys.dm_db_stats_properties 動的管理ビューが使用可能です。

  • SQL Server 2014 (12.x) Service Pack 2 および SQL Server 2012 (11.x) Service Pack 1 以降では、増分統計の統計オブジェクトに含まれるヘッダー情報をプログラムで取得するために、sys.dm_db_incremental_stats_properties 動的管理ビューが使用可能です。

  • SQL Server 2016 (13.x) Service Pack 1 CU2 以降では、統計オブジェクトに含まれるヒストグラム情報をプログラムで取得するために、sys.dm_db_stats_histogram 動的管理ビューが使用可能です。

  • この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

  • Microsoft Fabric Data Warehouse の統計情報の詳細については、「 統計」を参照してください。

Transact-SQL 構文表記規則

構文

Fabric での SQL Server、Azure SQL Database、および SQL データベースの構文:

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

Microsoft Fabric の Azure Synapse Analytics、Analytics Platform System (PDW)、Warehouse の構文:

DBCC SHOW_STATISTICS ( table_name , target )
    [ WITH { STAT_HEADER | DENSITY_VECTOR | HISTOGRAM } [ , ...n ] ]
[ ; ]

引数

table_or_indexed_view_name

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

テーブル名

表示する統計情報を含むテーブルの名前。 テーブルに外部テーブルを指定することはできません。

ターゲット

統計情報を表示するインデックス、統計、または列の名前。 target は、角かっこ、一重引用符、二重引用符で囲まれるか、または引用符を使用しません。

  • target がテーブルまたはインデックス付きビューの既存のインデックスまたは統計の名前である場合は、その target に関する統計情報が返されます。
  • ターゲットが既存の列の名前であり、この列に自動的に作成された統計オブジェクトが存在する場合は、その自動作成された統計に関する情報が返されます。

target 列に自動的に作成された統計が存在しない場合は、エラー メッセージ 2767 が返されます。

Azure Synapse Analytics および Analytics Platform System (PDW) では、target を列名にすることはできません。

Microsoft Fabric のウェアハウスでは、target には単一列ヒストグラム統計または列の名前を指定できます。 target に列名が使われている場合、このコマンドは、自動的に生成されるヒストグラム統計に関する分布情報のみを返します。 手動で作成したヒストグラム統計に関する情報を見るには、統計名を target として指定します。

NO_INFOMSGS

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

STAT_HEADER |DENSITY_VECTOR |ヒストグラム |STATS_STREAM [ , n ]

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

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

結果セット

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

列名 説明
Name 統計オブジェクトの名前。
Updated 統計情報が最後に更新された日付と時刻。 STATS_DATE 関数でこの情報を取得することもできます。 詳細については、このページの「解説」セクションを参照してください。
Rows 統計情報が最後に更新された時点のテーブルまたはインデックス付きビューの行の総数。 統計がフィルター選択されている場合、またはフィルター選択されたインデックスに対応している場合は、行数がテーブルの行数よりも少なくなることがあります。 詳細については、統計に関する記事を参照してください。
Rows Sampled 統計の計算時にサンプリングされた行の合計数。 Rows Sampled < Rowsの場合、表示されるヒストグラムと密度の結果は、サンプリングされた行に基づく推定値です。
Steps ヒストグラムの区間の数。 各区間の範囲には、上限の列値までの列値の範囲が含まれます。 ヒストグラムの区間は、統計の最初のキー列に基づいて定義されます。 区間の最大数は 200 です。
Density ヒストグラムの境界値を除く、統計オブジェクトの最初のキー列のすべての値について、"1 / distinct values " として計算されます。 このDensity値はクエリオプティマイザーでは使用されず、2008年以前のバージョン(10.0.x)との後方互換性SQL Server表示されます。
Average Key Length 統計オブジェクトのすべてのキー列の、値ごとの平均バイト数。
String Index はいは、統計オブジェクトに文字列要約統計が含まれており、 LIKE 演算子を使用するクエリ述語の濃度推定を改善することを示します。例えば、 WHERE ProductName LIKE '%Bike'。 文字列の統計概要は、ヒストグラムとは別に格納されます。この統計は、統計オブジェクトの最初のキー列について、その型が charvarcharncharnvarcharvarchar(max)nvarchar(max)textntext である場合に作成されます。
Filter Expression 統計オブジェクトに含まれるテーブル行のサブセットの述語。 NULL = フィルター選択されていない統計情報。 フィルター処理された述語の詳細については、「 フィルター選択されたインデックスの作成」を参照してください。 フィルター選択された統計情報の詳細については、「統計情報」を参照してください。
Unfiltered Rows フィルター式を適用する前のテーブル内の行の合計数。 フィルター式が NULL の場合、Unfiltered RowsRows は等しいです。
Persisted Sample Percent サンプリングの割合を明示的に指定しない統計情報の更新に使用される永続化されたサンプルのパーセンテージです。 値がゼロの場合、永続化されたサンプルのパーセンテージがこの統計に設定されていません。

対象:SQL Server 2016(13.x)Service Pack 1 CU 4以降のバージョン。

次の表では、 DENSITY_VECTOR が指定されたときに結果セットに返される列について説明します。

列名 説明
All Density 密度は "1 / distinct values" です。 結果には、統計オブジェクトの列の各プレフィックスに対する密度が、密度ごとに 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 Average lengthは、列プレフィックスの列値のリストを格納します。 たとえば、リスト (3, 5, 6) の値ごとに 4 バイト必要な場合は、長さは 12 バイトになります。
Columns All densityAverage lengthが表示される接頭辞の列名。

次の表では、 HISTOGRAM オプションを指定したときに結果セットに返される列について説明します。

列名 説明
RANGE_HI_KEY ヒストグラム区間の上限の列値。 この列値はキー値とも呼ばれます。
RANGE_ROWS ヒストグラム区間内 (上限は除く) に列値がある行の予測数。
EQ_ROWS ヒストグラム区間の上限と列値が等しい行の予測数。
DISTINCT_RANGE_ROWS ヒストグラム区間内 (上限は除く) にある個別の列値を持つ行の予測数。
AVG_RANGE_ROWS 上限を除く、ヒストグラムのステップ内で重複する列の値を持つ行の数の平均値。 DISTINCT_RANGE_ROWSが 0 より大きい場合、AVG_RANGE_ROWSRANGE_ROWSDISTINCT_RANGE_ROWSで除算して計算されます。 DISTINCT_RANGE_ROWSが 0 の場合、ヒストグラム ステップAVG_RANGE_ROWS 1 が返されます。

解説

統計の更新日付は、メタデータではなく統計 BLOB オブジェクトヒストグラムおよび密度ベクトルと共に格納されます。 統計データを生成するためのデータが読み取られない場合、統計 BLOB は作成されず、日付は使用できません。また、 updated 列は NULL。 これは、述語が行を返さないフィルター選択された統計情報や、新しい空のテーブルの場合です。

クエリオプティマイザーが特定のクエリをコンパイルした際にどの統計が読み込まれたかを特定するには、クエリの実際の実行計画XMLの StatisticsInfo 要素を調べてください。 その要素のStatistics属性は DBCC SHOW_STATISTICStarget 項です。 詳細については 、「クエリオプティマイザーがどの統計を使用したかを決定する」をご覧ください。

ヒストグラム

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

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

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

サンプリングした列の値からヒストグラムを計算する方法を示す図。

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

  • 太線は上限値(RANGE_HI_KEY)とその出現回数(EQ_ROWS)を表しています。
  • RANGE_HI_KEYの左側の実線は列の値の範囲と各列の値が現れる平均回数(AVG_RANGE_ROWS)を表しています。 最初のヒストグラム区間の AVG_RANGE_ROWS は常に 0 です。
  • 点線は、範囲内の異なる値の総数(DISTINCT_RANGE_ROWS)と範囲内の総値数(RANGE_ROWS)を推定するために用いられたサンプル値を表します。 クエリオプティマイザーは RANGE_ROWSDISTINCT_RANGE_ROWS を使って AVG_RANGE_ROWS を計算し、サンプリングされた値を保存しません。

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

密度ベクトル

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

列プレフィックス 密度の計算対象
(CustomerId) CustomerId の値が一致する行
(CustomerId, ItemId) CustomerId および ItemId 値が一致する行
(CustomerId, ItemId, Price) CustomerIdItemId、および Price の値が一致する行

制限事項

DBCC SHOW_STATISTICS では、空間インデックスおよびメモリ最適化列ストア インデックスの統計情報は提供されません。

SQL Server および SQL Database のアクセス許可

統計オブジェクトを表示するには、ユーザーがテーブルに対する SELECT 権限を持っている必要があります。

コマンドを実行するのに十分な SELECT アクセス許可には、次の要件があります。

  • ユーザーには、統計オブジェクト内のすべての列に対するアクセス許可が必要です。
  • ユーザーには、フィルター条件内のすべての列に対するアクセス許可が必要です (存在する場合)。
  • テーブルには、行レベルのセキュリティ ポリシーを持つことはできません。
  • 統計オブジェクト内のいずれかの列が動的データ マスク ルールでマスクされている場合、ユーザーは SELECT 権限に加えて、UNMASK 権限をもっているか、db_ddladmin ロールのメンバーである必要があります。

SQL Server 2012 (11.x) Service Pack 1 より前のバージョンでは、ユーザーはテーブルを所有しているか、sysadmin 固定サーバー ロール、db_owner 固定データベース ロール、または db_ddladmin 固定データベース ロールのメンバーである必要があります。 動作を SQL Server 2012 (11.x) Service Pack 1 以前の動作に戻すには、トレース フラグ 9485 を使用します。

Microsoft Fabric での Microsoft Fabric Data Warehouse と SQL 分析エンドポイントのアクセス許可

Fabric Data Warehouse または SQL 分析エンドポイントで統計オブジェクトを表示するには、テーブルに対する SELECT アクセス許可、または Viewer Fabric ワークスペース ロールのメンバー、またはそれ以上のロール メンバーシップが必要です。

Azure Synapse Analytics および Analytics Platform System (PDW) のアクセス許可

DBCC SHOW_STATISTICS には、テーブルに対する SELECT アクセス許可か、sysadmin 固定サーバー ロール、db_owner 固定データベース ロール、または db_ddladmin 固定データベース ロールのメンバーシップが必要です。

Azure Synapse Analytics および Analytics Platform System (PDW) の制限事項と制約事項

DBCC SHOW_STATISTICS を使用すると、コントロール ノード レベルでの Shell データベースに格納されている統計情報が表示されます。 コンピューティング ノード上の SQL Server によって自動的に作成された統計は表示されません。

外部テーブルで DBCC SHOW_STATISTICS はサポートされていません。

Microsoft Fabric の Warehouse では、 DBCC SHOW_STATISTICS ではヒストグラム統計の結果のみが表示され、統計情報 ACE-* 表示されません。

例: Fabric の SQL Server、Azure SQL Database、SQL データベース

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

以下の例は、AdventureWorks2025データベースのAK_Address_rowguidテーブルのPerson.Addressインデックスのすべての統計情報を表示します。

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

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

これにより、Customer_LastName について表示される統計情報は HISTOGRAM データに制限されます。

DBCC SHOW_STATISTICS ("dbo.DimCustomer", Customer_LastName) WITH HISTOGRAM;
GO

例: Azure Synapse Analytics、Analytics Platform System (PDW)

C. 1 つの統計オブジェクトの内容を表示します。

次の例では、統計オブジェクトを作成し、Customer_LastName サンプル データベースの DimCustomer テーブルに 統計の内容を表示します。

-- Uses AdventureWorksPDW
--First, create a statistics object
CREATE STATISTICS Customer_LastName
ON AdventureWorksPDW2012.dbo.DimCustomer (LastName);
GO
DBCC SHOW_STATISTICS ("dbo.DimCustomer", Customer_LastName);
GO

結果は、ヘッダー、密度ベクトル、およびヒストグラムの一部を示します。

DBCC SHOW_STATISTICS結果を示すスクリーンショット。