次の方法で共有


専用 SQL プール内のテーブル統計を作成および更新する

この記事では、専用 SQL プール内のテーブルに関するクエリ最適化の統計を作成および更新するための推奨事項と例を提供します。

統計を使用する理由

専用 SQL プールがデータに関する情報を多く持っているほど、それに対するクエリを高速に実行できます。 専用 SQL プールにデータを読み込んだ後、そのデータに関する統計を収集することは、クエリを最適化するために実行できる最も重要な作業の 1 つです。

専用 SQL プール クエリ オプティマイザーは、コストベースのオプティマイザーです。 オプティマイザーでは、さまざまなクエリ プランのコストが比較されて、最も低コストのプランが選択されます。 多くの場合、最も高速に実行されるプランが選択されます。

たとえば、クエリのフィルター処理の日付で 1 行が返されることが予測される場合、オプティマイザーは特定のプランを選択します。 選択された日付で 100 万行が返されることが予測される場合、オプティマイザーは別のプランを選択します。

統計の自動作成

データベースの AUTO_CREATE_STATISTICS オプションがオンになっている場合、専用 SQL プールでは受信ユーザー クエリを分析して、足りない統計がないかどうか確認します。

統計が足りない場合、クエリ オプティマイザーでは、クエリ述語または結合条件内の個々の列で統計を作成することで、クエリ プランに対するカーディナリティ評価が改善されます。

Note

既定では、統計の自動作成は有効です。

専用 SQL プールで AUTO_CREATE_STATISTICS が構成されているかどうかは、次の T-SQL コマンドを実行して確認できます。

SELECT name, is_auto_create_stats_on
FROM sys.databases

専用 SQL プールで AUTO_CREATE_STATISTICS が構成されていない場合は、次のコマンドを実行して、このプロパティを有効にすることをお勧めします。 <your-datawarehouse-name> を専用 SQL プールの名前に置き換えてください。

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

これらのステートメントによって、次の統計の自動作成がトリガーされます。

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN (結合が含まれているか、または述語の存在が検出された場合)

Note

統計の自動作成は、一時テーブルや外部テーブルに対しては実行されません。

統計の自動作成は同期的に行われるため、列に統計がない場合、クエリのパフォーマンスが多少低下する可能性があります。 1 つの列の統計を作成する時間は、テーブルのサイズに依存します。

明らかなパフォーマンスの低下を回避するには、システムをプロファイルする前にベンチマーク用ワークロードを実行することによって、統計を先に作成しておく必要があります。

注意

統計の作成は、各ユーザー コンテキスト内の sys.dm_pdw_exec_requests にログ記録されます。

自動統計が作成された場合は、_WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex> の形式になります。 作成済みの統計は、DBCC SHOW_STATISTICS コマンドを実行して表示できます。

DBCC SHOW_STATISTICS (<table_name>, <target>)

table_name は、表示する統計が含まれているテーブルの名前です。 このテーブルに外部テーブルを指定することはできません。 target は、統計情報を表示するターゲットのインデックス、統計、または列の名前です。

統計を更新します。

ベスト プラクティスの 1 つが、新しい日付が追加されるたびに日付列の統計を更新することです。 新しい行が専用 SQL プールに読み込まれるたびに、新しい読み込みの日付またはトランザクションの日付が追加されます。 これらの追加によってデータの分布が変わり、統計が古くなります。

顧客テーブルの国または地域の列の統計は更新する必要がないと考えられます。一般的に値の分布は変わらないためです。 顧客間で分布が一定であると仮定すると、テーブル バリエーションに新しい行を追加しても、データの分布が変わることはありません。

ただし、専用 SQL プールに 1 つの国または地域しか含まれておらず、新しい国または地域のデータを取り込んで複数の国または地域のデータが格納されるようになった場合は、国または地域の列の統計を更新する必要があります。

統計更新のレコメンデーションは次のとおりです。

統計属性 推奨
統計の更新の頻度 控え目: 毎日
データの読み込みまたは変換後
サンプリング 行数が 10 億未満の場合は、既定のサンプリング (20%) が使用されます。
10 億行を超えると、2% のサンプリングが使用されます。

クエリをトラブルシューティングするときにたずねる最初の質問の 1 つは、「統計は最新の状態ですか?」です。

この質問に対して、データの経過時間で答えることはできません。 基になるデータに重要な変更がない場合は、最新の統計オブジェクトが古い可能性があります。 行数が大幅に変わった場合や、列の値の分布で重大な変更があった場合は、"その後で" 統計を更新する必要があります。

テーブル内のデータが、統計が最後に更新された時刻以降に変更されたかどうかを判定するための動的管理ビューはありません。 次の 2 つのクエリは、統計が古くなっているかどうかを判断するのに役立ちます。

  • クエリ 1: 統計の行数 (stats_row_count) と実際の行数 (actual_row_count) の違いを見つけます。

    select 
    objIdsWithStats.[object_id], 
    actualRowCounts.[schema], 
    actualRowCounts.logical_table_name, 
    statsRowCounts.stats_row_count, 
    actualRowCounts.actual_row_count,
    row_count_difference = CASE
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
        ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
    END,
    percent_deviation_from_actual = CASE
        WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
        WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
        ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    END
    from
    (
        select distinct object_id from sys.stats where stats_id > 1
    ) objIdsWithStats
    left join
    (
        select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
    ) statsRowCounts
    on objIdsWithStats.object_id = statsRowCounts.object_id 
    left join
    (
        SELECT sm.name [schema] ,
            tb.name logical_table_name ,
            tb.object_id object_id ,
            SUM(rg.row_count) actual_row_count
        FROM sys.schemas sm
             INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
             INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
             INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
             INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg     ON rg.object_id = nt.object_id
                AND rg.pdw_node_id = nt.pdw_node_id
                AND rg.distribution_id = nt.distribution_id
        WHERE rg.index_id = 1
        GROUP BY sm.name, tb.name, tb.object_id
    ) actualRowCounts
    on objIdsWithStats.object_id = actualRowCounts.object_id
    
    
  • クエリ 2: 各テーブルで統計が最後に更新された時刻をチェックすることによって、統計の経過時間を見つけます。

    Note

    列の値の分布に大きな変更がある場合は、それらが最後に更新された時刻には関係なく、統計を更新する必要があります。

    SELECT
        sm.[name] AS [schema_name],
        tb.[name] AS [table_name],
        co.[name] AS [stats_column_name],
        st.[name] AS [stats_name],
        STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
    FROM
        sys.objects ob
        JOIN sys.stats st
            ON  ob.[object_id] = st.[object_id]
        JOIN sys.stats_columns sc
            ON  st.[stats_id] = sc.[stats_id]
            AND st.[object_id] = sc.[object_id]
        JOIN sys.columns co
            ON  sc.[column_id] = co.[column_id]
            AND sc.[object_id] = co.[object_id]
        JOIN sys.types  ty
            ON  co.[user_type_id] = ty.[user_type_id]
        JOIN sys.tables tb
            ON  co.[object_id] = tb.[object_id]
        JOIN sys.schemas sm
            ON  tb.[schema_id] = sm.[schema_id]
    WHERE
        st.[user_created] = 1;
    

たとえば、専用 SQL プールの日付列では、通常、統計を頻繁に更新する必要があります。 新しい行が専用 SQL プールに読み込まれるたびに、新しい読み込みの日付またはトランザクションの日付が追加されます。 これらの追加によってデータの分布が変わり、統計が古くなります。

一方、顧客テーブルの性別列の統計は更新する必要がないと考えられます。 顧客間で分布が一定であると仮定すると、テーブル バリエーションに新しい行を追加しても、データの分布が変わることはありません。

専用 SQL プールに 1 つの性別しか含まれておらず、新しい要件によって複数の性別が含まれるようになった場合は、性別列の統計を更新する必要があります。

詳しくは、「統計」をご覧ください。

統計管理の実装

多くの場合は、同時実行クエリ間のブロックやリソース競合を回避するか、または最小限に抑えるために、データ読み込みプロセスを拡張して読み込みの最後に統計が確実に更新されるようにすることをお勧めします。

データの読み込みは、テーブルのサイズや値の分布が最も頻繁に変更されるタイミングです。 データ読み込みは、何らかの管理プロセスを実装する論理的な場所となります。

統計を更新する際の基本原則は、次のとおりです。

  • 読み込まれた各テーブルに更新された統計オブジェクトが少なくとも 1 つは含まれていることを確認します。 これにより、統計の更新の一環として、テーブル サイズ (行数とページ数) 情報が更新されます。
  • JOIN、GROUP BY、ORDER BY、DISTINCT の各句に関与している列を重視します。
  • トランザクションの日付などの "昇順キー" 列の値は、統計ヒストグラムに含まれていないため、これらをより頻繁に更新することを検討します。
  • 静的な分布列の更新頻度を減らすことを検討します。
  • 各統計オブジェクトは順序どおりに更新されることに注意してください。 特に、多数の統計オブジェクトが含まれた幅の広いテーブルでは、 UPDATE STATISTICS <TABLE_NAME> を実装するだけでは十分とはいえない場合があります。

詳細については、「カーディナリティ推定」を参照してください。

例 :統計を作成する

以下の例では、さまざまなオプションを使用して統計を作成する方法を示します。 各列に対して使用するオプションは、データの特性や、その列のクエリでの使用方法によって異なります。

既定のオプションを使用した単一列統計の作成

列の統計を作成するには、統計オブジェクトの名前と列の名前を指定します。

次の構文では、既定のオプションをすべて使用しています。 既定では、統計を作成するときに、テーブルの 20% がサンプリングされます。

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

次に例を示します。

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

すべての列の検査による単一列統計の作成

ほとんどの場合、20% という既定のサンプリング レートで十分です。 ただし、サンプリング レートを調整することもできます。

テーブル全体をサンプリングするには、次の構文を使用します。

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

次に例を示します。

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

サンプル サイズを指定した単一列統計の作成

サンプル サイズをパーセントで指定することもできます。

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

一部の行のみの単一列統計の作成

テーブルの一部の行の統計を作成することもできます。 これは "フィルター選択された統計" と呼ばれます。

たとえば、大規模なパーティション テーブルの特定のパーティションのクエリを計画するときに、フィルター選択された統計を使用できます。 パーティション値のみに関する統計を作成することにより、統計の精度が向上するため、クエリのパフォーマンスは向上します。

次の例では、値の範囲の統計を作成します。 パーティションの値の範囲に一致する値を簡単に定義できます。

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

注意

クエリ オプティマイザーが分散クエリ プランを選択するときに、フィルター選択された統計の使用も考慮されるようにするには、クエリが統計オブジェクトの定義の範囲内である必要があります。 前の例では、クエリの WHERE 句で col1 の値として 2000101 ~ 20001231 の値を指定する必要があります。

すべてのオプションを使用した単一列統計の作成

オプションは組み合わせることができます。 次の例では、カスタム サンプル サイズを指定してフィルター選択された統計オブジェクトを作成します。

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

詳細については、「CREATE STATISTICS」をご覧ください。

複数列統計の作成

複数列統計オブジェクトを作成するには、これまでの例を使用しますが、複数の列を指定します。

Note

クエリ結果の行数の推定に使用されるヒストグラムは、統計オブジェクト定義に示されている最初の列にのみ使用できます。

この例では、ヒストグラムは product_category に関するものです。 列間の統計は、product_categoryproduct_sub_category に関して計算されます。

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

product_categoryproduct_sub_category の間には相関関係があるため、複数列統計オブジェクトは、これらの列が同時にアクセスされる場合に役立ちます。

テーブルのすべての列の統計の作成

統計を作成するための 1 つの方法として、テーブルを作成した後に CREATE STATISTICS コマンドを発行します。

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

ストアド プロシージャを使用した、SQL プール内のすべての列の統計の作成

専用 SQL プールには、SQL Server の sp_create_stats に相当するシステム ストアド プロシージャはありません。 このストアド プロシージャは、まだ統計がない SQL プールのすべての列の単一列統計オブジェクトを作成します。

次の例は、SQL プールの設計を開始する方法を示しています。 ニーズに合わせて、このオブジェクトを自由に変更できます。

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

既定値を使用してテーブルのすべての列の統計を作成するには、ストアド プロシージャを実行します。

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

フルスキャンを使用してテーブルのすべての列の統計を作成するには、次のプロシージャを呼び出します。

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

テーブル内のすべての列に関するサンプリングされた統計を作成するには、「3」、サンプル率の順に入力します。 このプロシージャでは、20 % のサンプル レートを使用します。

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

例 :統計を更新します。

統計を更新するには、次の操作を行います。

  • 統計オブジェクトを 1 つ更新します。 更新する統計オブジェクトの名前を指定します。
  • テーブルのすべての統計オブジェクトを更新します。 特定の統計オブジェクトではなく、テーブルの名前を指定します。

1 つの特定の統計オブジェクトの更新

特定の統計オブジェクトを更新するには、次の構文を使用します。

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

次に例を示します。

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

特定の統計オブジェクトを更新することで、統計を管理するために必要な時間とリソースを最小限に抑えることができます。 そうするには、更新する最適な統計オブジェクトの選択について少し検討する必要があります。

テーブルのすべての統計を更新する

テーブルのすべての統計オブジェクトを更新する簡単な方法を次に示します。

UPDATE STATISTICS [schema_name].[table_name];

次に例を示します。

UPDATE STATISTICS dbo.table1;

UPDATE STATISTICS は、使いやすいステートメントです。 このステートメントはテーブルのすべての統計を更新するので、必要以上の処理が実行される可能性があります。 パフォーマンスが問題でない場合は、これが、統計が最新の状態であることを保証するための最も簡単で、かつ最も完全な方法です。

Note

テーブル上のすべての統計を更新する場合、専用 SQL プールではスキャンを実行して、統計オブジェクトごとにテーブルをサンプリングします。 テーブルが大きく、多数の列と統計が含まれている場合は、ニーズに基づいて個々の統計を更新する方が効率的です。

UPDATE STATISTICS プロシージャの実装については、一時テーブルに関する記事をご覧ください。 実装方法は前述の CREATE STATISTICS プロシージャと若干異なりますが、結果は同じです。

完全な構文については、「UPDATE STATISTICS 」を参照してください。

統計のメタデータ

統計に関する情報を確認する際に使用できるシステム ビューとシステム関数がいくつかあります。 たとえば、stats-date 関数を使用して、統計が最後に作成または更新されたのがいつであるかを確認することで、統計オブジェクトが古くなっているかどうかがわかります。

統計のカタログ ビュー

次のシステム ビューは、統計に関する情報を提供します。

カタログ ビュー 説明
sys.columns 列ごとに 1 行
sys.objects データベース内のオブジェクトごとに 1 行
sys.schemas データベース内のスキーマごとに 1 行
sys.stats 統計オブジェクトごとに 1 行
sys.stats_columns 統計オブジェクト内の列ごとに 1 行、元の sys.columns にリンク
sys.tables テーブル (外部テーブルを含む) ごとに 1 行
sys.table_types データ型ごとに 1 行

統計のシステム関数

次のシステム関数は統計の操作に役立ちます。

システム関数 説明
STATS_DATE 統計オブジェクトが最後に更新された日付
DBCC SHOW_STATISTICS 統計オブジェクトによって認識される値の分布に関する概要レベルの情報と詳細情報

1 つのビューへの統計列と関数の統合

このビューには、統計に関連する列と STATS_DATE() 関数からの結果がまとめて表示されます。

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

DBCC SHOW_STATISTICS() の例

DBCC SHOW_STATISTICS() では、統計オブジェクト内に保持されているデータが表示されます。 このデータは 3 つの部分で提供されます。

  • ヘッダー
  • 密度ベクトル
  • ヒストグラム

ヘッダーには、統計に関するメタデータが含まれます。 ヒストグラムには、統計オブジェクトの最初のキー列の値の分布が表示されます。 密度ベクトルは、列間の相関関係を測定します。

注意

専用 SQL プールでは、統計オブジェクト内のデータを使用してカーディナリティ推定値を計算します。

ヘッダー、密度、ヒストグラムの表示

次の簡単な例は、統計オブジェクトの 3 つの部分をすべて表示します。

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

次に例を示します。

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

DBCC SHOW_STATISTICS() の 1 つ以上の部分の表示

特定の部分だけを表示する場合は、WITH 句を使用して表示する部分を指定します。

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

次に例を示します。

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

DBCC SHOW_STATISTICS() の相違点

SQL Server に比べ、専用 SQL プールには、DBCC SHOW_STATISTICS() がより厳密に実装されています。

  • ドキュメントに記載されていない機能はサポートされていません。
  • Stats_stream は使用できません。
  • 統計データの特定のサブセットの結果を結合することはできません。 たとえば、STAT_HEADER JOIN DENSITY_VECTOR のようにします。
  • メッセージの抑制のために NO_INFOMSGS を設定することはできません。
  • 統計名を囲む角かっこは使用できません。
  • 列名を使用して、統計オブジェクトを識別することはできません。
  • カスタム エラー 2767 はサポートされていません。

DMV を使用して Azure Synapse Analytics の専用 SQL プールのワークロードを監視する