適用対象:✅ ファブリック データ エンジニアリングとデータ サイエンス
Microsoft Fabricの自動テーブル統計は、Spark がデルタ テーブルのテーブルと列のメトリックを自動的に収集することでクエリの実行を最適化するのに役立ちます。
- 行数。
- 列あたりの Null カウント数。
- 列あたりの最小値と最大値。
- 列あたりの個別の値数。
- 列の平均長と最大長。
既定では、これらの拡張統計は、Fabric の Delta テーブルの最初の 32 列 (入れ子になった列を含む) に対して収集されます。 このデータは、Spark のコストベースのオプティマイザー (CBO) が結合、フィルター、集計、パーティションの排除の計画を改善するのに役立ちます。
その結果、多くのワークロードでクエリの待ち時間とコンピューティング使用量が減り、手動の統計メンテナンスが少なくなります。
テーブルの最適化戦略に関するワークロード間のガイダンスについては、 クロスワークロード テーブルのメンテナンスと最適化に関するトピックを参照してください。
主な利点
自動統計には、次の利点があります。
- Fabric の Delta テーブルに対して自動的に有効になります。
- 一般的な分析パターンのクエリ計画の品質が向上します。
- 手動で統計を繰り返し収集する必要が減ります。
- データ ファイルの肥大化を回避するために、テーブル データ ファイルの外部に統計を格納します。
動作方法
Fabric Spark では、書き込み時に拡張統計が収集され、計画中に使用されます。
コレクションのスコープと動作:
- 統計は書き込み時に収集されます。
- コレクションは、最初の 32 列 (入れ子になった列を含む) を対象としています。
- テーブルのプロパティは、セッション レベルの動作をオーバーライドできます。
- 構成では、Spark がオプティマイザーに統計を挿入するかどうかを制御します。
これらのメトリックは、Spark がより適切な結合戦略を選択し、パーティションの排除を改善し、集計計画を最適化するのに役立ちます。
統計収集を有効または無効にする
セッション構成 (ワークスペースまたはノートブックのスコープ) またはテーブルのプロパティ (テーブルごとのスコープ) を使用します。
セッションの構成
拡張統計収集とオプティマイザーの挿入は、セッション レベルで有効または無効にすることができます。
これらの設定は、Spark SQL、PySpark、または Scala Spark を使用して適用できます。
次の Spark SQL ステートメントを実行して、コレクションとオプティマイザーの挿入を制御します。
SET spark.microsoft.delta.stats.collect.extended=true;
SET spark.microsoft.delta.stats.collect.extended=false;
SET spark.microsoft.delta.stats.injection.enabled=true;
SET spark.microsoft.delta.stats.injection.enabled=false;
注
差分ログ統計収集 (spark.databricks.delta.stats.collect) も有効にする必要があります (既定値: true)。
テーブルのプロパティ (セッション構成のオーバーライド)
テーブルのプロパティを使用すると、個々のテーブルの統計コレクションを制御し、セッション設定をオーバーライドできます。
テーブルで有効にする:
ALTER TABLE tableName
SET TBLPROPERTIES(
'delta.stats.extended.collect' = 'true',
'delta.stats.extended.inject' = 'true'
)
テーブルで無効にする:
ALTER TABLE tableName
SET TBLPROPERTIES(
'delta.stats.extended.collect' = 'false',
'delta.stats.extended.inject' = 'false'
)
テーブル作成の既定の動作
このセッション レベルの設定を使用して、新しいテーブルの作成時に拡張統計テーブルプロパティの自動スタンプを無効にします。
テーブルの作成時に自動設定を無効にするには、次の Spark SQL ステートメントを使用します。
SET spark.microsoft.delta.stats.collect.extended.property.setAtTableCreation=false;
統計を確認する
Spark の API を使用して、収集されたテーブルと列の統計を検査できます。デバッグや検証に役立ちます。
行数とテーブル サイズを確認する (Scala の例):
println(spark.read.table("tableName").queryExecution.optimizedPlan.stats)
詳細な列の統計を確認してください。
val stats = spark.read.table("tableName").queryExecution.optimizedPlan.stats
stats.attributeStats.foreach { case (attrName, colStat) =>
println(s"colName: $attrName distinctCount: ${colStat.distinctCount} min: ${colStat.min} max: ${colStat.max} nullCount: ${colStat.nullCount} avgLen: ${colStat.avgLen} maxLen: ${colStat.maxLen}")
}
統計を再計算する
スキーマの変更または部分的な更新後に統計が古くなる可能性があります。 再計算するには、次のいずれかの方法を使用します。
テーブルを書き換えます (注: 履歴がリセットされます)。
spark.read.table("targetTable").write.partitionBy("partCol").mode("overwrite").saveAsTable("targetTable")
推奨される方法 (Fabric Spark >= 3.2.0.19):
StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")
スキーマが変更された場合 (列の追加/削除など)、再計算する前に古い統計を削除する必要があります。
StatisticsStore.removeStatisticsData(spark, "testTable1")
StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")
ANALYZE TABLE を使用する
すべての列の統計を手動で更新する場合は、 ANALYZE TABLE を使用します。
次のコマンドを実行します。
次の Spark SQL ステートメントを実行します。
ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS
カタログ統計の挿入を有効にする:
次の Spark SQL ステートメントを使用して、カタログ統計の挿入を有効または無効にします。
SET spark.microsoft.delta.stats.injection.catalog.enabled=true;
SET spark.microsoft.delta.stats.injection.catalog.enabled=false;
制限事項
それに応じて計画できるように、Fabric の自動統計の現在の制限事項を理解することが重要です。
- 統計は書き込み時にのみ収集されます。
- 他のエンジンからの更新は自動的に集計されません。
- 最初の 32 列のみが含まれます (入れ子になった列を含む)。
- 削除と更新により、統計が古くなる可能性があります。
- 再計算には、書き換えまたは統計 API 操作が必要です。
- 統計の挿入は、入れ子になった列には適用されません。
- 一部のワークロードでは、古い統計または不完全な統計が回帰につながる可能性があります。
-
ANALYZE TABLEサポートはFOR ALL COLUMNSに制限されています。 - 列の順序または構成の変更には、完全な更新が必要な場合があります。