適用対象:✅ Microsoft Fabric の SQL 分析エンドポイントおよびWarehouse
Microsoft Fabric の Warehouse は、クエリ エンジンを使用して、特定の SQL クエリの実行プランを作成します。 クエリを送信すると、クエリ オプティマイザーは考えられるすべてのプランを列挙し、最も効率的な候補を選択しようとします。 どのプランが最小のオーバーヘッド (I/O、CPU、メモリ) を必要とするかを判断するには、エンジンが各オペレーターで処理される可能性のある作業量または行の量を評価できる必要があります。 次に、各プランのコストに基づいて、推定作業量が最も少ないプランが選択されます。 統計は、クエリ オプティマイザーがこれらのコストを見積もることができるようにする、データに関する関連情報を含むオブジェクトです。
統計の使用方法
最適なクエリ パフォーマンスを実現するには、正確な統計を取得することが重要です。 Microsoft Fabric は現在、関連する最新の統計を提供するために次のパスをサポートしています。
- ユーザー定義の統計情報
- ユーザーは、必要に応じて、データ定義言語 (DDL) 構文を手動で使用して統計の作成、更新、削除を行います
- 自動統計
すべてのテーブルの手動統計
統計の健全性を維持する従来のオプションは、Microsoft Fabric で利用できます。 ユーザーは、 CREATE STATISTICS、UPDATE STATISTICS、DROP STATISTICS をそれぞれ使用して、ヒストグラム ベースの単一列統計を作成、更新、削除できます。 ユーザーは、DBCC SHOW_STATISTICS を使用して、ヒストグラム ベースの単一列統計の内容を表示することもできます。 現在、これらのステートメントの制限付きバージョンがサポートされています。
- 統計を手動で作成する場合は、クエリ ワークロード (特に GROUP BY、ORDER BY、フィルター、JOIN) で頻繁に使用される列に焦点を当てることを検討してください。
- データの変更により行数やデータの分布が大きく変化した後は、列レベルの統計を定期的に更新することを検討してください。
手動統計メンテナンスの例
dbo.DimCustomer 列のすべての行に基づいて CustomerKey テーブルの統計を作成するには:
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 で手動で作成された統計と自動で作成された統計の両方を確認することもできます。
- sys.stats カタログ ビュー
- sys.stats_columns カタログ ビュー
- STATS_DATE システム関数
クエリでの自動統計
クエリを発行し、クエリ オプティマイザーでプラン探索のために統計が必要となるたびに、それらの統計がまだ存在しない場合は、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');
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 の下に表示される場合があります。 これらのオブジェクトはクエリの最適化には使用されません。