Azure SQL Data Warehouse でのテーブルの統計Table statistics in Azure SQL Data Warehouse

Azure SQL Data Warehouse 内のテーブルに関するクエリ用に最適化された統計の作成と更新の推奨事項と例を示します。Recommendations and examples for creating and updating query-optimization statistics on tables in Azure SQL Data Warehouse.

統計を使用する理由Why use statistics

Azure SQL Data Warehouse がデータに関する情報を多く持っているほど、データに対するクエリを高速に実行できます。The more Azure SQL Data Warehouse knows about your data, the faster it can execute queries against it. SQL Data Warehouse にデータを読み込んだ後、データに関する統計を収集することは、クエリの最適化のために実行できる最も重要なことの 1 つです。After loading data into SQL Data Warehouse, collecting statistics on your data is one of the most important things you can do to optimize your queries. SQL Data Warehouse のクエリ オプティマイザーは、コスト ベースのオプティマイザーです。The SQL Data Warehouse query optimizer is a cost-based optimizer. オプティマイザーでは、さまざまなクエリ プランのコストが比較されて、最も低コストのプランが選択されます。It compares the cost of various query plans, and then chooses the plan with the lowest cost. 多くの場合、それは最も高速に実行されるプランが選択されます。In most cases, it chooses the plan that will execute the fastest. たとえば、クエリでフィルター処理されている日付に対して返されるのは 1 行であるとオプティマイザーで推定されると、1 つのプランが選択されます。For example, if the optimizer estimates that the date your query is filtering on will return one row it will choose one plan. 選択された日付で返されるのが 100 万行であると推定された場合は、別のプランが返されます。If it estimates that the selected date will return 1 million rows, it will return a different plan.

統計の自動作成Automatic creation of statistic

データベースの AUTO_CREATE_STATISTICS オプションがオンの場合、SQL Data Warehouse では足りない統計に対して受信ユーザー クエリが分析されます。When the database AUTO_CREATE_STATISTICS option is on, SQL Data Warehouse analyzes incoming user queries for missing statistics. 統計が足りない場合、クエリ オプティマイザーでは、クエリ述語または結合条件内の個々の列で統計を作成することで、クエリ プランに対するカーディナリティ評価が改善されます。If statistics are missing, the query optimizer creates statistics on individual columns in the query predicate or join condition to improve cardinality estimates for the query plan. 既定では、統計の自動作成は有効です。Automatic creation of statistics is currently turned on by default.

データ ウェアハウスで AUTO_CREATE_STATISTICS が構成されているかどうかは、次のコマンドを実行することで確認できます。You can check if your data warehouse has AUTO_CREATE_STATISTICS configured by running the following command:

SELECT name, is_auto_create_stats_on
FROM sys.databases

データ ウェアハウスで AUTO_CREATE_STATISTICS が構成されていない場合は、次のコマンドでこのプロパティを有効にすることをお勧めします。If your data warehouse does not have AUTO_CREATE_STATISTICS configured, we recommend you enable this property by running the following command:

ALTER DATABASE <yourdatawarehousename>
SET AUTO_CREATE_STATISTICS ON

結合が含まれること、または述語が存在することが検出されると、次のステートメントによって統計の自動作成がトリガーされます。These statements will trigger automatic creation of statistics:

  • SELECTSELECT
  • INSERT-SELECTINSERT-SELECT
  • CTASCTAS
  • UPDATEUPDATE
  • DELETEDELETE
  • EXPLAINEXPLAIN when containing a join or the presence of a predicate is detected

注意

一時テーブルや外部テーブルに対して自動作成の統計が作成にされることはありません。Automatic creation of statistics are not created on temporary or external tables.

統計の自動作成は同期的に行われるため、列に統計がない場合、クエリのパフォーマンスが多少低下することがあります。Automatic creation of statistics is done synchronously so you may incur slightly degraded query performance if your columns are missing statistics. 1 つの列の統計を作成する時間は、テーブルのサイズに依存します。The time to create statistics for a single column depends on the size of the table. 明らかなパフォーマンスの低下 (特にパフォーマンス ベンチマークでの低下) を回避するには、システムをプロファイルする前にベンチマーク用ワークロードを実行することによって、統計を先に作成しておく必要があります。To avoid measurable performance degradation, especially in performance benchmarking, you should ensure stats have been created first by executing the benchmark workload before profiling the system.

注意

統計の作成は、各ユーザー コンテキスト内の sys.dm_pdw_exec_requests にログ記録されます。The creation of stats will be logged in sys.dm_pdw_exec_requests under a different user context.

自動統計が作成されると、WA_Sys<16 進 8 桁の列 ID><16 進 8 桁のテーブル ID> の形式でログ記録されます。When automatic statistics are created, they will take the form: WA_Sys<8 digit column id in Hex><8 digit table id in Hex>. 作成済みの統計は、DBCC SHOW_STATISTICS コマンドを実行して表示できます。You can view stats that have already been created by running the DBCC SHOW_STATISTICS command:

DBCC SHOW_STATISTICS (<table_name>, <target>)

table_name は、表示する統計が格納されているテーブルの名前です。The table_name is the name of the table that contains the statistics to display. 外部テーブルは使用できません。This cannot be an external table. target は、統計情報を表示するターゲットのインデックス、統計、または列の名前です。The target is the name of the target index, statistics, or column for which to display statistics information.

統計の更新Updating statistics

ベスト プラクティスの 1 つが、新しい日付が追加されるたびに日付列の統計を更新することです。One best practice is to update statistics on date columns each day as new dates are added. 新しい行がデータ ウェアハウスに読み込まれるたびに、新しい読み込みの日付またはトランザクションの日付が追加されます。Each time new rows are loaded into the data warehouse, new load dates or transaction dates are added. これらによってデータの分布が変わり、統計が古くなります。These change the data distribution and make the statistics out of date. 一方、顧客テーブルの国または地域の列の統計は更新する必要がないと考えられます。一般的に値の分布は変わらないためです。Conversely, statistics on a country/region column in a customer table might never need to be updated, because the distribution of values doesn’t generally change. 顧客間で分布が一定であると仮定すると、テーブル バリエーションに新しい行を追加しても、データの分布が変わることはありません。Assuming the distribution is constant between customers, adding new rows to the table variation isn't going to change the data distribution. ただし、データ ウェアハウスに 1 つの国または地域しか含まれておらず、新しい国または地域のデータを取り込んで複数の国または地域のデータが格納されるようになった場合は、国または地域の列の統計を更新する必要があります。However, if your data warehouse only contains one country/region and you bring in data from a new country/region, resulting in data from multiple countries/regions being stored, then you need to update statistics on the country/region column.

統計更新のレコメンデーションは次の通りです。The following are recommendations updating statistics:

統計の更新の頻度Frequency of stats updates 控えめ: 毎日Conservative: Daily
データを読み込むか変換した後After loading or transforming your data
サンプリングSampling 行数が 10 億未満の場合は、既定のサンプリング (20%) が使用されます。Less than 1 billion rows, use default sampling (20 percent).
10 億行を超えると、2% のサンプリングが使用されます。With more than 1 billion rows, use sampling of two percent.

クエリのトラブルシューティングを行うときに最初に尋ねる質問の 1 つが、「統計は最新の状態ですか」というものです。One of the first questions to ask when you're troubleshooting a query is, "Are the statistics up to date?"

この質問は、データの経過時間で答えられるものではありません。This question is not one that can be answered by the age of the data. 基になるデータに重要な変更がない場合は、最新の統計オブジェクトが古い可能性があります。An up-to-date statistics object might be old if there's been no material change to the underlying data. 行数が大幅に変わった場合や、列の値の分布で重大な変更があった場合は、"その後で" 統計を更新する必要があります。When the number of rows has changed substantially, or there is a material change in the distribution of values for a column, then it's time to update statistics.

前回の統計が更新されてからテーブル内のデータが変更されたかどうかを判断するための動的管理ビューはありません。There is no dynamic management view to determine if data within the table has changed since the last time statistics were updated. 統計情報の経過期間がわかると、全体像の一部を把握できます。Knowing the age of your statistics can provide you with part of the picture. 以下のクエリでは、それぞれのテーブルで統計情報が最後に更新された時刻を確認できます。You can use the following query to determine the last time your statistics were updated on each table.

注意

列の値の分布に重要な変更がある場合は、最後に更新された時刻に関係なく統計を更新する必要があります。If there is a material change in the distribution of values for a column, you should update statistics regardless of the last time they were updated.

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;

たとえば、データ ウェアハウスの日付列では、通常、統計を頻繁に更新する必要があります。Date columns in a data warehouse, for example, usually need frequent statistics updates. 新しい行がデータ ウェアハウスに読み込まれるたびに、新しい読み込みの日付またはトランザクションの日付が追加されます。Each time new rows are loaded into the data warehouse, new load dates or transaction dates are added. これらによってデータの分布が変わり、統計が古くなります。These change the data distribution and make the statistics out of date. 一方、顧客テーブルの性別列の統計は更新する必要がないと考えられます。Conversely, statistics on a gender column in a customer table might never need to be updated. 顧客間で分布が一定であると仮定すると、テーブル バリエーションに新しい行を追加しても、データの分布が変わることはありません。Assuming the distribution is constant between customers, adding new rows to the table variation isn't going to change the data distribution. ただし、データ ウェアハウスに 1 つの性別しか含まれておらず、新しい要件によって複数の性別が含まれるようになった場合は、性別列の統計を更新する必要があります。However, if your data warehouse contains only one gender and a new requirement results in multiple genders, then you need to update statistics on the gender column.

詳しくは、「統計」をご覧ください。For more information, see general guidance for Statistics.

統計管理の実装Implementing statistics management

多くの場合、読み込みの終わりに統計が確実に更新されるように、データ読み込みプロセスを拡張することが推奨されます。It is often a good idea to extend your data-loading process to ensure that statistics are updated at the end of the load. テーブルのサイズや値の分布が変わる頻度が最も高いのがデータの読み込み時です。The data load is when tables most frequently change their size and/or their distribution of values. したがって、これが管理プロセスを実装する論理的な場所となります。Therefore, this is a logical place to implement some management processes.

読み込みプロセスで統計を更新する際の基本原則は、次のとおりです。The following guiding principles are provided for updating your statistics during the load process:

  • 読み込まれた各テーブルに更新された統計オブジェクトが少なくとも 1 つは含まれていることを確認します。Ensure that each loaded table has at least one statistics object updated. これにより、統計の更新の一環として、テーブル サイズ (行数とページ数) 情報が更新されます。This updates the table size (row count and page count) information as part of the statistics update.
  • JOIN、GROUP BY、ORDER BY、DISTINCT の各句に関与している列を重視します。Focus on columns participating in JOIN, GROUP BY, ORDER BY, and DISTINCT clauses.
  • トランザクションの日付などの "昇順キー" 列の値は、統計ヒストグラムに含まれないため、これらの列の更新頻度を増やすことを検討します。Consider updating "ascending key" columns such as transaction dates more frequently, because these values will not be included in the statistics histogram.
  • 静的な分布列の更新頻度を減らすことを検討します。Consider updating static distribution columns less frequently.
  • 各統計オブジェクトは順序どおりに更新されることに注意してください。Remember, each statistic object is updated in sequence. 特に、多数の統計オブジェクトが含まれた幅の広いテーブルでは、 UPDATE STATISTICS <TABLE_NAME> を実装するだけでは十分とはいえない場合があります。Simply implementing UPDATE STATISTICS <TABLE_NAME> isn't always ideal, especially for wide tables with lots of statistics objects.

詳細については、「カーディナリティ推定」を参照してください。For more information, see Cardinality Estimation.

次に例を示します。統計を作成するExamples: Create statistics

以下の例では、さまざまなオプションを使用して統計を作成する方法を示します。These examples show how to use various options for creating statistics. 各列に使用するオプションは、データの特性とクエリでの列の使用方法によって異なります。The options that you use for each column depend on the characteristics of your data and how the column will be used in queries.

既定のオプションを使用した単一列統計の作成Create single-column statistics with default options

列の統計を作成するには、統計オブジェクトの名前と列の名前を指定するだけです。To create statistics on a column, simply provide a name for the statistics object and the name of the column.

次の構文では、既定のオプションをすべて使用しています。This syntax uses all of the default options. 既定では、SQL Data Warehouse は統計を作成するときに、テーブルの 20% をサンプリングします。By default, SQL Data Warehouse samples 20 percent of the table when it creates statistics.

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

例:For example:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

すべての列の検査による単一列統計の作成Create single-column statistics by examining every row

ほとんどの場合、20% という既定のサンプリング レートで十分です。The default sampling rate of 20 percent is sufficient for most situations. ただし、サンプリング レートを調整することもできます。However, you can adjust the sampling rate.

テーブル全体をサンプリングするには、次の構文を使用します。To sample the full table, use this syntax:

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

例:For example:

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

サンプル サイズを指定した単一列統計の作成Create single-column statistics by specifying the sample size

サンプル サイズをパーセントで指定することもできます。Alternatively, you can specify the sample size as a percent:

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

一部の行のみの単一列統計の作成Create single-column statistics on only some of the rows

テーブルの一部の行の統計を作成することもできます。You can also create statistics on a portion of the rows in your table. これは、フィルター選択された統計と呼ばれます。This is called a filtered statistic.

たとえば、大規模なパーティション テーブルの特定のパーティションのクエリを計画するときに、フィルター選択された統計を使用できます。For example, you can use filtered statistics when you plan to query a specific partition of a large partitioned table. パーティション値のみで統計を作成すると、統計の精度が向上するので、クエリのパフォーマンスが向上します。By creating statistics on only the partition values, the accuracy of the statistics will improve, and therefore improve query performance.

次の例では、値の範囲の統計を作成します。This example creates statistics on a range of values. パーティションの値の範囲に一致する値を簡単に定義できます。The values can easily be defined to match the range of values in a partition.

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

注意

クエリ オプティマイザーが分散クエリ プランを選択するときに、フィルター選択された統計の使用も考慮されるようにするには、クエリが統計オブジェクトの定義の範囲内である必要があります。For the query optimizer to consider using filtered statistics when it chooses the distributed query plan, the query must fit inside the definition of the statistics object. 前の例では、クエリの WHERE 句で col1 の値として 2000101 ~ 20001231 の値を指定する必要があります。Using the previous example, the query's WHERE clause needs to specify col1 values between 2000101 and 20001231.

すべてのオプションを使用した単一列統計の作成Create single-column statistics with all the options

オプションは組み合わせることができます。You can also combine the options together. 次の例では、カスタム サンプル サイズを指定してフィルター選択された統計オブジェクトを作成します。The following example creates a filtered statistics object with a custom sample size:

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

詳細については、「CREATE STATISTICS」をご覧ください。For the full reference, see CREATE STATISTICS.

複数列統計の作成Create multi-column statistics

複数列統計オブジェクトを作成するには、これまでの例を使用するだけですが、複数の列を指定します。To create a multi-column statistics object, simply use the previous examples, but specify more columns.

注意

クエリ結果の行数の推定に使用されるヒストグラムは、統計オブジェクト定義に示されている最初の列にのみ使用できます。The histogram, which is used to estimate the number of rows in the query result, is only available for the first column listed in the statistics object definition.

次の例では、ヒストグラムは product_category で使用されます。In this example, the histogram is on product_category. 列間の統計は、product_categoryproduct_sub_category で計算されます。Cross-column statistics are calculated on product_category and product_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 の間には相関関係があるため、これらの列に同時にアクセスする場合は複数列統計オブジェクトが役立ちます。Because there is a correlation between product_category and product_sub_category, a multi-column statistics object can be useful if these columns are accessed at the same time.

テーブルのすべての列の統計の作成Create statistics on all columns in a table

統計を作成する方法の 1 つとして、テーブルの作成後に CREATE STATISTICS コマンドを発行します。One way to create statistics is to issue CREATE STATISTICS commands after creating the table:

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);

ストアド プロシージャを使用した、データベース内のすべての列の統計の作成Use a stored procedure to create statistics on all columns in a database

SQL Data Warehouse には、SQL Server の sp_create_stats に相当するシステム ストアド プロシージャはありません。SQL Data Warehouse does not have a system stored procedure equivalent to sp_create_stats in SQL Server. このストアド プロシージャは、まだ統計がないデータベースのすべての列の単一列統計オブジェクトを作成します。This stored procedure creates a single column statistics object on every column of the database that doesn't already have statistics.

次の例は、データベースの設計を開始する際に役立ちます。The following example will help you get started with your database design. ニーズに合わせて、この例を自由に変更できます。Feel free to adapt it to your needs:

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;

既定値を使用してテーブルのすべての列の統計を作成するには、ストアド プロシージャを実行します。To create statistics on all columns in the table using the defaults, execute the stored procedure.

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

フルスキャンを使用してテーブルのすべての列の統計を作成するには、次のプロシージャを呼び出します。To create statistics on all columns in the table using a fullscan, call this procedure:

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

テーブルのすべての列にサンプルの統計を作成するには、「3」およびサンプル率を入力します。To create sampled statistics on all columns in the table, enter 3, and the sample percent. このプロシージャでは、20% のサンプル レートを使用します。This procedures uses a 20 percent sample rate.

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

すべての列にサンプルの統計を作成するにはTo create sampled statistics on all columns

次に例を示します。統計を更新するExamples: Update statistics

統計を更新するには、次の操作を行います。To update statistics, you can:

  • 統計オブジェクトを 1 つ更新します。Update one statistics object. 更新する統計オブジェクトの名前を指定します。Specify the name of the statistics object you want to update.
  • テーブルのすべての統計オブジェクトを更新します。Update all statistics objects on a table. 特定の統計オブジェクトではなく、テーブルの名前を指定します。Specify the name of the table instead of one specific statistics object.

1 つの特定の統計オブジェクトの更新Update one specific statistics object

特定の統計オブジェクトを更新するには、次の構文を使用します。Use the following syntax to update a specific statistics object:

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

例:For example:

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

特定の統計オブジェクトを更新することで、統計を管理するために必要な時間とリソースを最小限に抑えることができます。By updating specific statistics objects, you can minimize the time and resources required to manage statistics. この場合、更新する最適な統計オブジェクトの選択について少し検討する必要があります。This requires some thought to choose the best statistics objects to update.

テーブルのすべての統計の更新Update all statistics on a table

テーブルのすべての統計オブジェクトを更新する簡単な方法を次に示します。A simple method for updating all the statistics objects on a table is:

UPDATE STATISTICS [schema_name].[table_name];

例:For example:

UPDATE STATISTICS dbo.table1;

UPDATE STATISTICS ステートメントは簡単に使用できます。The UPDATE STATISTICS statement is easy to use. このステートメントはテーブルのすべての統計を更新するので、必要以上の処理が実行される可能性があります。Just remember that it updates all statistics on the table, and therefore might perform more work than is necessary. パフォーマンスが問題でない場合は、これが、統計が最新の状態であることを保証する最も簡単で最も包括的な方法です。If performance is not an issue, this is the easiest and most complete way to guarantee that statistics are up to date.

注意

テーブルのすべての統計を更新する場合、SQL Data Warehouse では、統計オブジェクトごとにテーブルのスキャンを実行してサンプリングします。When updating all statistics on a table, SQL Data Warehouse does a scan to sample the table for each statistics object. テーブルが大きく、多数の列と統計が含まれている場合は、ニーズに基づいて個々の統計を更新する方が効率的です。If the table is large and has many columns and many statistics, it might be more efficient to update individual statistics based on need.

UPDATE STATISTICS プロシージャの実装については、一時テーブルに関する記事をご覧ください。For an implementation of an UPDATE STATISTICS procedure, see Temporary Tables. 実装方法は前述の CREATE STATISTICS プロシージャと若干異なりますが、結果は同じです。The implementation method is slightly different from the preceding CREATE STATISTICS procedure, but the result is the same.

完全な構文については、「UPDATE STATISTICS 」を参照してください。For the full syntax, see Update Statistics.

統計のメタデータStatistics metadata

統計に関する情報を確認する際に使用できるシステム ビューとシステム関数がいくつかあります。There are several system views and functions that you can use to find information about statistics. たとえば、stats-date 関数を使用して、統計が最後に作成または更新されたのがいつであるかを確認することで、統計オブジェクトが古くなっているかどうかがわかります。For example, you can see if a statistics object might be out of date by using the stats-date function to see when statistics were last created or updated.

統計のカタログ ビューCatalog views for statistics

次のシステム ビューは、統計に関する情報を提供します。These system views provide information about statistics:

カタログ ビューCatalog view 説明Description
sys.columnssys.columns 列ごとに 1 行。One row for each column.
sys.objectssys.objects データベース内のオブジェクトごとに 1 行。One row for each object in the database.
sys.schemassys.schemas データベースのスキーマごとに 1 行。One row for each schema in the database.
sys.statssys.stats 統計オブジェクトごとに 1 行。One row for each statistics object.
sys.stats_columnssys.stats_columns 統計オブジェクトの列ごとに 1 行。One row for each column in the statistics object. sys.columns にリンク。Links back to sys.columns.
sys.tablessys.tables テーブル (外部テーブルを含む) ごとに 1 行。One row for each table (includes external tables).
sys.table_typessys.table_types データ型ごとに 1 行。One row for each data type.

統計のシステム関数System functions for statistics

次のシステム関数は統計の操作に役立ちます。These system functions are useful for working with statistics:

システム関数System function 説明Description
STATS_DATESTATS_DATE 統計オブジェクトの最終更新日。Date the statistics object was last updated.
DBCC SHOW_STATISTICSDBCC SHOW_STATISTICS 統計オブジェクトで認識される値の分布に関する概要レベルの情報と詳細情報。Summary level and detailed information about the distribution of values as understood by the statistics object.

1 つのビューへの統計列と関数の統合Combine statistics columns and functions into one view

このビューには、統計に関連する列と、STATS_DATE() 関数の結果が一緒に表示されます。This view brings columns that relate to statistics and results from the STATS_DATE() function together.

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() examples

DBCC SHOW_STATISTICS() は、統計オブジェクト内に保持されているデータを表示します。DBCC SHOW_STATISTICS() shows the data held within a statistics object. このデータは 3 つの部分で提供されます。This data comes in three parts:

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

ヘッダーには、統計に関するメタデータが含まれます。The header metadata about the statistics. ヒストグラムには、統計オブジェクトの最初のキー列の値の分布が表示されます。The histogram displays the distribution of values in the first key column of the statistics object. 密度ベクトルは、列間の相関関係を測定します。The density vector measures cross-column correlation. SQL Data Warehouse では、統計オブジェクト内のデータを使用してカーディナリティ推定値を計算します。SQL Data Warehouse computes cardinality estimates with any of the data in the statistics object.

ヘッダー、密度、ヒストグラムの表示Show header, density, and histogram

次の簡単な例は、統計オブジェクトの 3 つの部分をすべて表示します。This simple example shows all three parts of a statistics object:

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

例:For example:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

DBCC SHOW_STATISTICS() の 1 つ以上の部分の表示Show one or more parts of DBCC SHOW_STATISTICS()

特定の部分だけを表示する場合は、WITH 句を使用して表示する部分を指定します。If you're only interested in viewing specific parts, use the WITH clause and specify which parts you want to see:

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

例:For example:

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

DBCC SHOW_STATISTICS() の相違点DBCC SHOW_STATISTICS() differences

SQL Server に比べ、SQL Data Warehouse では、DBCC SHOW_STATISTICS() がより厳密に実装されています。DBCC SHOW_STATISTICS() is more strictly implemented in SQL Data Warehouse compared to SQL Server:

  • ドキュメントに記載されていない機能はサポートされていません。Undocumented features are not supported.
  • Stats_stream は使用できません。Cannot use Stats_stream.
  • 統計データの特定のサブセットの結果を結合することはできませんCannot join results for specific subsets of statistics data. たとえば、STAT_HEADER JOIN DENSITY_VECTOR。For example, STAT_HEADER JOIN DENSITY_VECTOR.
  • メッセージを抑制するために、NO_INFOMSGS を設定することはできません。NO_INFOMSGS cannot be set for message suppression.
  • 統計名を囲む角かっこは使用できません。Square brackets around statistics names cannot be used.
  • 列名を使用して、統計オブジェクトを識別することはできません。Cannot use column names to identify statistics objects.
  • カスタム エラー 2767 はサポートされていません。Custom error 2767 is not supported.

次の手順Next steps

クエリのパフォーマンスをさらに向上させるには、ワークロードの監視に関する記事を参照してくださいFor further improve query performance, see Monitor your workload