Fabric Spark での自動テーブル統計の構成と管理

適用対象:✅ ファブリック データ エンジニアリングとデータ サイエンス

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.injection.enabled=true;

どちらかの設定を無効にするには、同じコマンドを値を falseに設定して使います。

差分ログ統計収集 (spark.databricks.delta.stats.collect) も有効にする必要があります (既定値: true)。

Important

テーブルで 削除ベクトル を有効にする場合は、そのテーブルの統計挿入を無効にします。 頻繁に更新または削除される削除ベクトルを使用するテーブルでは、拡張統計が不正確になり、Spark がテーブル サイズを過小評価する可能性があります。 この場合、オプティマイザーは、適切ではないブロードキャスト結合を選択する可能性があり、クエリが失敗する可能性があります。 この動作を回避するには、オプティマイザーが挿入された統計を使用しないように、統計の挿入を無効にします。

  • セッション スコープ: spark.microsoft.delta.stats.injection.enabledfalse に設定します。
  • テーブル スコープ: delta.stats.extended.inject table プロパティを false に設定します。

統計収集を有効にしておくことができます。 削除ベクトルを使用するテーブルの場合は、オプティマイザーへの挿入のみを無効にします。

定期的なテーブルメンテナンス戦略はこのリスクを軽減します。 OPTIMIZE 削除ベクターで5% 行以上参照されているファイルを自動的に消去し、その閾値以下の書き換えを強制 REORG TABLE ... APPLY (PURGE) できます。 拡張統計は書き込み時に収集されるため、リライトは影響を受けたファイルの統計を更新します。 頻繁に更新や削除があるテーブルについては、メンテナンスサイクル間に注入を無効にしてください。

テーブルのプロパティ (セッション構成のオーバーライド)

テーブルのプロパティを使用すると、個々のテーブルの統計コレクションを制御し、セッション設定をオーバーライドできます。

テーブルで有効にする:

ALTER TABLE tableName
SET TBLPROPERTIES(
    'delta.stats.extended.collect' = 'true',
    'delta.stats.extended.inject' = 'true'
)

どちらかのテーブルプロパティを無効にするには、その値を falseに設定してください。

テーブル作成の既定の動作

このセッション レベルの設定を使用して、新しいテーブルの作成時に拡張統計テーブルプロパティの自動スタンプを無効にします。

テーブルの作成時に自動設定を無効にするには、次の Spark SQL ステートメントを使用します。

SET spark.microsoft.delta.stats.collect.extended.property.setAtTableCreation=false;

統計を確認する

Spark APIを使って最適化されたクエリプランで利用可能な統計を確認できます。 これらのAPIは、Sparkカタログの統計を含むあらゆる利用可能なソースから汎用プラン統計を返します。 結果はFabricの拡張統計がテーブルのために収集されたことを裏付けるものではありません。

行数とテーブル サイズを確認する (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):

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

スキーマが変わった場合(例えば列の追加や削除など)、再計算前に古い統計情報を削除してください:

from pyspark.sql.delta import StatisticsStore

StatisticsStore.removeStatisticsData(spark, "testTable1")
StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

ANALYZE TABLE を使用する

ANALYZE TABLEを使ってすべての列にわたるSparkカタログの統計を計算してください。 このコマンドは、自動テーブル統計によって格納された拡張統計を再計算しません。 これらの統計を再計算するには、 StatisticsStore.recomputeStatisticsWithCompactionを使いましょう。

次のコマンドを実行します。

次の Spark SQL ステートメントを実行します。

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

カタログ統計の挿入を有効にする:

このSpark SQL文を使ってカタログ統計注入を有効にしてください:

SET spark.microsoft.delta.stats.injection.catalog.enabled=true;

カタログ統計注入を無効にするには、同じ設定を値を falseに設定してください。

制限事項

それに応じて計画できるように、Fabric の自動統計の現在の制限事項を理解することが重要です。

  • 統計は書き込み時にのみ収集されます。
  • 他のエンジンからの更新は自動的に集計されません。
  • 最初の 32 列のみが含まれます (入れ子になった列を含む)。
  • 削除と更新により、統計が古くなる可能性があります。 削除ベクターを使用するテーブルでは、通常の OPTIMIZE または REORG TABLE ... APPLY (PURGE) メンテナンスで影響を受けたファイルを書き換え、統計を更新します。 頻繁に更新や削除が行われるテーブルのメンテナンスサイクル間の統計注入を無効にしてください。
  • 再計算には、書き換えまたは統計 API 操作が必要です。
  • 統計の挿入は、入れ子になった列には適用されません。
  • 一部のワークロードでは、古い統計または不完全な統計が回帰につながる可能性があります。
  • ANALYZE TABLE サポートは FOR ALL COLUMNSに制限されています。
  • 列の順序または構成の変更には、完全な更新が必要な場合があります。