Statistics

適用対象:✅ Microsoft Fabric の SQL 分析エンドポイントおよびWarehouse

Microsoft Fabric の Warehouse は、クエリ エンジンを使用して、特定の SQL クエリの実行プランを作成します。 クエリを送信すると、クエリ オプティマイザーは考えられるすべてのプランを列挙し、最も効率的な候補を選択しようとします。 どのプランが最小のオーバーヘッド (I/O、CPU、メモリ) を必要とするかを判断するには、エンジンが各オペレーターで処理される可能性のある作業量または行の量を評価できる必要があります。 次に、各プランのコストに基づいて、推定作業量が最も少ないプランが選択されます。 統計は、クエリ オプティマイザーがこれらのコストを見積もることができるようにする、データに関する関連情報を含むオブジェクトです。

統計の使用方法

最適なクエリ パフォーマンスを実現するには、正確な統計を取得することが重要です。 Microsoft Fabric は現在、関連する最新の統計を提供するために次のパスをサポートしています。

すべてのテーブルの手動統計情報

統計の正常性を維持する従来のオプションは、Microsoft Fabric で利用できます。 ユーザーは、 CREATE STATISTICS、UPDATE STATISTICS、DROP STATISTICS をそれぞれ使用して、ヒストグラム ベースの単一列統計を作成、更新、削除できます。 ユーザーは、DBCC SHOW_STATISTICS を使用して、ヒストグラム ベースの単一列統計の内容を表示することもできます。 現在、これらのステートメントの制限付きバージョンがサポートされています。

  • 統計を手動で作成する場合は、クエリ ワークロード (特に GROUP BY 句、ORDER BY 句、フィルター、JOIN で) で頻繁に使用される列に焦点を当てることを検討してください。
  • データの変更により行数やデータの分布が大きく変化した後は、列レベルの統計を定期的に更新することを検討してください。

手動統計メンテナンスの例

列 CustomerKey 内のすべての行に基づいて、dbo.DimCustomer テーブルの統計を作成するには:

CREATE STATISTICS DimCustomer_CustomerKey_FullScan
ON dbo.DimCustomer (CustomerKey) WITH FULLSCAN;

大規模なデータ更新後に統計オブジェクト DimCustomer_CustomerKey_FullScan を手動で更新するには:

UPDATE STATISTICS dbo.DimCustomer (DimCustomer_CustomerKey_FullScan) WITH FULLSCAN;  

統計オブジェクトに関する情報を表示するには:

DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan");

統計オブジェクトのヒストグラムに関する情報のみを表示するには:

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

統計オブジェクト DimCustomer_CustomerKey_FullScan を手動で削除するには:

DROP STATISTICS dbo.DimCustomer.DimCustomer_CustomerKey_FullScan;

次の T-SQL オブジェクトを使用して、Microsoft Fabric で手動で作成された統計と自動で作成された統計の両方を確認することもできます。

クエリ時の自動統計情報

クエリを発行し、クエリ オプティマイザーでプラン探索のために統計が必要となるたびに、それらの統計がまだ存在しない場合は、Microsoft Fabric によって自動的に作成されます。 統計が作成されると、クエリ オプティマイザーはそれらを利用して、トリガーとなるクエリのプラン コストを見積もることができます。 さらに、クエリに関連する既存の統計がデータを正確に反映していないとクエリ エンジンで判断された場合、それらの統計は自動的に更新されます。 これらの自動操作は同期的に実行されるため、必要な統計がまだ存在しない場合、または最後の統計の更新後に重大なデータ変更が発生した場合、クエリの所要時間にはこの時間が含まれることが予想されます。

クエリ実行時に自動統計を検証します

何らかの種類の自動統計が期待できるさまざまな場合があります。 最も一般的なのはヒストグラム ベースの統計です。これは、GROUP BY、JOIN、DISTINCT 句、フィルター (WHERE 句)、ORDER BY で参照される列について、クエリ オプティマイザーが要求する統計です。 たとえば、これらの統計の自動作成を確認したい場合、COLUMN_NAME の統計がまだ存在しない場合、クエリによって作成がトリガーされます。 例えば:

SELECT <COLUMN_NAME>
FROM <YOUR_TABLE_NAME>
GROUP BY <COLUMN_NAME>;

この場合、COLUMN_NAME の統計が作成されていることを想定する必要があります。 列が varchar 列でもある場合は、平均列長の統計も作成されます。 統計が自動的に作成されたことを検証する場合は、次のクエリを実行できます。

select
    object_name(s.object_id) AS [object_name],
    c.name AS [column_name],
    s.name AS [stats_name],
    s.stats_id,
    STATS_DATE(s.object_id, s.stats_id) AS [stats_update_date], 
    s.auto_created,
    s.user_created,
    s.stats_generation_method_desc 
FROM sys.stats AS s 
INNER JOIN sys.objects AS o 
ON o.object_id = s.object_id 
LEFT JOIN sys.stats_columns AS sc 
ON s.object_id = sc.object_id 
AND s.stats_id = sc.stats_id 
LEFT JOIN sys.columns AS c 
ON sc.object_id = c.object_id 
AND c.column_id = sc.column_id
WHERE o.type = 'U' -- Only check for stats on user-tables
    AND s.auto_created = 1
    AND o.name = '<YOUR_TABLE_NAME>'
ORDER BY object_name, column_name;

これで、自動的に生成されたヒストグラム統計の statistics_name (_WA_Sys_00000007_3B75D760 のようなものになるはずです) を見つけて、次の T-SQL を実行できます。

DBCC SHOW_STATISTICS ('<YOUR_TABLE_NAME>', '<statistics_name>');

例えば:

DBCC SHOW_STATISTICS ('sales.FactInvoice', '_WA_Sys_00000007_3B75D760');

DBCC SHOW_STATISTICS の結果セットの Updated 値は、元の GROUP BY クエリを実行したときと同様の日付 (UTC) である必要があります。

これらの自動的に生成された統計は、その後のクエリでクエリ エンジンによって活用され、プランのコスト計算の精度と実行効率を向上させることができます。 テーブルに十分な変更が発生した場合、クエリ エンジンはそれらの統計も更新してクエリの最適化を向上させます。 テーブルを大幅に変更した後も、先ほどのサンプル演習を適用できます。 Fabric では、SQL クエリ エンジンは SQL Server 2016 (13.x) と同じ再コンパイルしきい値を使用して統計を更新します。

自動生成される統計の種類

Microsoft Fabric には、クエリ プランを改善するためにエンジンによって自動的に生成される複数の種類の統計があります。 現在、それらは sys.stats にありますが、すべてが対応可能であるわけではありません。

  • ヒストグラム統計
    • クエリ時にヒストグラム統計が必要な列ごとに作成されます
    • これらのオブジェクトには、特定の列の分布に関するヒストグラムと密度情報が含まれています。 Azure Synapse Analytics 専用プールでクエリ時に自動的に作成される統計と同様です。
    • 名前は _WA_Sys_ で始まります。
    • 内容は DBCC SHOW_STATISTICS で表示できます
  • 平均列長の統計
    • 100 を超える可変文字列列 (varchar) で、クエリ時に平均列長を必要とする場合に作成されます。
    • これらのオブジェクトには、統計作成時の varchar 列の平均行サイズを表す値が含まれています。
    • 名前は ACE-AverageColumnLength_ で始まります。
    • 内容は表示できず、ユーザーによる操作の対象外です。
  • テーブルベースのカーディナリティ統計
    • クエリ時にカーディナリティ推定が必要なテーブルごとに、他の行数メタデータが利用できない場合にのみ作成されます
      • これらのオブジェクトには、テーブルの行数の推定値が含まれています。
      • ACE-Cardinality という名前です。
      • 内容は表示できず、ユーザーによる操作の対象外です。

Fabric の統計における組み込み最適化

増分統計の更新

増分統計更新は、列統計の自動更新のパフォーマンスを向上させます。

通常、列の統計が自動的に更新されると、統計を更新するために列全体のサンプルをスキャンする必要があります。 この機能は、前回の更新以降に追加された行のみをサンプリングし、そのデータを既存のヒストグラムとマージすることで、可能な場合にこれらの操作を高速化します。

エンジンが列統計の更新を要求すると、この高速更新方法を使用できるかどうかを自動的に判断します。 増分統計の更新は、通常、前回の統計更新以降、ほとんどがINSERTである大規模なテーブルに対して効果的です。

主動的な統計の更新

プロアクティブ統計更新は、データ変更後に統計更新をフロントロードしようとするフル マネージド プロセスです。

この最適化は、クエリ プランの生成中に統計の更新によって発生する遅延が発生する SELECT クエリの可能性を減らすことを目的としています。

プロアクティブ統計の更新は、自動的に生成されたヒストグラム統計 (システム生成の名前付け規則が _WA_Sys_) にのみ影響します。

プロアクティブ統計更新機能は既定で有効になっていますが、 ALTER DATABASE T-SQL コマンドを使用して構成できます。

制限事項

  • 手動で作成および変更できるのは、単一列のヒストグラム統計のみです。
  • 複数列の統計の作成はサポートされていません。
  • 手動で作成された統計や自動で作成された統計とは別に、他の統計オブジェクトが sys.stats に存在する場合があります。 これらのオブジェクトはクエリの最適化には使用されません。