Konfigurieren und Verwalten automatisierter Tabellenstatistiken in Fabric Spark

Gilt für:✅ Fabric Data Engineering und Data Science

Automatisierte Tabellenstatistiken in Microsoft Fabric helfen Spark, die Abfrageausführung zu optimieren, indem Tabellen- und Spaltenmetriken für Delta-Tabellen automatisch gesammelt werden.

  • Zeilenanzahl.
  • Nullanzahl pro Spalte.
  • Mindest- und Maximalwerte pro Spalte.
  • Unterschiedliche Werte zählen pro Spalte.
  • Durchschnittliche und maximale Spaltenlänge.

Standardmäßig werden diese erweiterten Statistiken für die ersten 32 Spalten (einschließlich geschachtelter Spalten) von Delta-Tabellen in Fabric gesammelt. Diese Daten helfen Sparks kostenbasiertem Optimierer (CBO), die Planung für Verknüpfungen, Filter, Aggregationen und Partitionspruning zu verbessern.

Daher können viele Workloads die Abfragelatenz reduzieren und die Berechnungsauslastung mit weniger manueller Statistikwartung reduzieren.

Für arbeitsübergreifende Anleitungen zu Strategien zur Tabellenoptimierung siehe "Auslastungsübergreifende Tabellenwartung und -optimierung".

Hauptvorteile

Automatisierte Statistiken bieten die folgenden Vorteile:

  • Wird automatisch für Delta-Tabellen in Fabric aktiviert.
  • Verbessert die Qualität der Abfrageplanung für allgemeine Analysemuster.
  • Reduziert den Bedarf an wiederholten manuellen Statistiken.
  • Speichert Statistiken außerhalb von Tabellendatendateien, um die Aufblähung von Datendateien zu vermeiden.

Funktionsweise

Fabric Spark sammelt erweiterte Statistiken zur Schreibzeit und verwendet sie während der Planung.

Sammlungsbereich und -verhalten:

  • Statistiken werden zur Schreibzeit gesammelt.
  • Die Sammlung zielt auf die ersten 32 Spalten (einschließlich geschachtelter Spalten) ab.
  • Tabelleneigenschaften können das Verhalten auf Sitzungsebene außer Kraft setzen.
  • Die Konfiguration steuert, ob Spark Statistiken in den Optimierer einjiziert.

Diese Metriken helfen Spark bei der Auswahl besserer Verknüpfungsstrategien, verbessern die Partitions pruning und optimieren Aggregationspläne.

Aktivieren oder Deaktivieren der Statistiksammlung

Verwenden Sie entweder die Sitzungseinstellungen (Arbeitsbereich oder Notizbuch) oder die Tabelleneigenschaften (Bereich pro Tabelle).

Sitzungskonfiguration

Sie können erweiterte Statistikensammlung und Optimierereinfügung auf Sitzungsebene aktivieren oder deaktivieren.

Diese Einstellungen können über Spark SQL, PySpark oder Scala Spark angewendet werden.

Führen Sie die folgenden Spark SQL-Anweisungen aus, um Collection und Optimizer Injection zu ermöglichen:

SET spark.microsoft.delta.stats.collect.extended=true;
SET spark.microsoft.delta.stats.injection.enabled=true;

Um eine der beiden Einstellungen zu deaktivieren, verwenden Sie denselben Befehl mit dem auf false gesetzten Wert.

Hinweis

Die Delta-Protokollstatistiksammlung (spark.databricks.delta.stats.collect) muss ebenfalls aktiviert sein (Standard: true).

Von Bedeutung

Wenn Sie Löschvektoren für eine Tabelle aktivieren, deaktivieren Sie die Statistikeinfügung für diese Tabelle. Bei Tabellen, die Löschvektoren verwenden und häufig aktualisiert oder gelöscht werden, können die erweiterten Statistiken ungenau werden und dazu führen, dass Spark die Tabellengröße unterschätzt. In diesem Fall kann der Optimierer eine nicht geeignete Broadcast-Verknüpfung auswählen, was dazu führen kann, dass Abfragen fehlschlagen. Um dieses Verhalten zu verhindern, deaktivieren Sie das Einfügen von Statistiken, damit der Optimierer die eingefügten Statistiken nicht verwendet:

  • Sitzungsbereich: spark.microsoft.delta.stats.injection.enabled auf false festlegen.
  • Tabellenbereich: Legen Sie die delta.stats.extended.inject Tabelleneigenschaft auf false.

Sie können die Statistiksammlung aktiviert lassen. Deaktivieren Sie für Tabellen, die Löschvektoren verwenden, nur die Einfügung in den Optimierer.

Eine Strategie zur regelmäßigen Tabellenwartung verringert dieses Risiko. OPTIMIZE Löscht automatisch Dateien, bei denen mehr als 5% Zeilen durch Löschvektoren referenziert werden, und REORG TABLE ... APPLY (PURGE) kann eine Umschreibung unterhalb dieses Schwellenwerts erzwingen. Da erweiterte Statistiken zur Schreibzeit gesammelt werden, aktualisiert das Rewrite die Statistiken der betroffenen Dateien. Für Tabellen mit häufigen Aktualisierungen oder Löschungen sollte die Injektion zwischen den Wartungszyklen deaktiviert bleiben.

Tabelleneigenschaften (Sitzungseinstellungen außer Kraft setzen)

Mithilfe von Tabelleneigenschaften können Sie die Sammlung von Statistiken für einzelne Tabellen steuern und Sitzungseinstellungen überschreiben.

Aktivieren sie in einer Tabelle:

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

Um eine der beiden Tabelleneigenschaften zu deaktivieren, setzen Sie ihren Wert auf false.

Standardverhalten der Tabellenerstellung

Verwenden Sie diese Einstellung auf Sitzungsebene, um das automatische Stempeln erweiterter Tabelleneigenschaften für erweiterte Statistiken zu deaktivieren, wenn neue Tabellen erstellt werden.

Verwenden Sie diese Spark SQL-Anweisung, um die automatische Einstellung bei der Tabellenerstellung zu deaktivieren:

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

Überprüfen von Statistiken

Sie können die für einen optimierten Abfrageplan verfügbaren Statistiken mit Spark-APIs einsehen. Diese APIs liefern allgemeine Planstatistiken aus jeder verfügbaren Quelle, einschließlich Spark-Katalogstatistiken. Das Ergebnis ist kein Beleg dafür, dass für die Tabelle erweiterte Statistiken von Fabric erfasst wurden.

Überprüfen der Zeilenanzahl und Tabellengröße (Scala-Beispiel):

println(spark.read.table("tableName").queryExecution.optimizedPlan.stats)

Detaillierte Spaltenstatistiken überprüfen:

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}")
}

Neukompilieren von Statistiken

Statistiken können nach Schemaänderungen oder teilweisen Aktualisierungen veraltet werden. Verwenden Sie einen der folgenden Ansätze, um neu zu berechnen.

Schreiben Sie die Tabelle neu (Hinweis: dies setzt den Verlauf zurück).

spark.read.table("targetTable").write.partitionBy("partCol").mode("overwrite").saveAsTable("targetTable")

Empfohlener Ansatz (Fabric Spark >= 3.2.0.19):

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

Wenn sich das Schema ändert (zum Beispiel wenn Sie Spalten hinzufügen oder entfernen), entfernen Sie alte Statistiken vor der Neuberechnung:

from pyspark.sql.delta import StatisticsStore

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

VERWENDE ANALYSETABELLE

Verwenden Sie ANALYZE TABLE, um Spark-Katalogstatistiken für alle Spalten zu berechnen. Dieser Befehl berechnet die erweiterten Statistiken, die von Automated Table Statistics gespeichert werden, nicht erneut. Um diese Statistiken neu zu berechnen, verwenden Sie StatisticsStore.recomputeStatisticsWithCompaction.

Führen Sie den folgenden Befehl aus:

Führen Sie die folgende Spark SQL-Anweisung aus:

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

Katalogstatistikeinfügung aktivieren:

Verwenden Sie diese Spark SQL-Anweisung, um die Katalogstatistik-Injektion zu ermöglichen:

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

Um die Katalogstatistik-Injektion zu deaktivieren, verwenden Sie dieselbe Einstellung mit dem Wert auf false.

Einschränkungen

Es ist wichtig, die aktuellen Einschränkungen der automatisierten Statistiken von Fabric zu verstehen, damit Sie entsprechend planen können.

  • Statistiken werden nur zur Schreibzeit erfasst.
  • Updates von anderen Engines werden nicht automatisch aggregiert.
  • Nur die ersten 32 Spalten sind enthalten (einschließlich geschachtelter Spalten).
  • Lösch- und Aktualisierungen können Statistiken veraltet machen. Bei Tabellen, die Löschvektoren verwenden, schreibt die reguläre OPTIMIZE oder REORG TABLE ... APPLY (PURGE) Wartung betroffene Dateien neu und aktualisiert deren Statistiken. Deaktivieren Sie die Statistik-Injektion zwischen Wartungszyklen auf Tabellen mit häufigen Aktualisierungen oder Löschungen.
  • Für Neuberechnen ist ein Neuschreiben oder Statistik-API-Vorgang erforderlich.
  • Die Statistikeinfügung gilt nicht für geschachtelte Spalten.
  • In einigen Workloads können veraltete oder unvollständige Statistiken zu Regressionen führen.
  • ANALYZE TABLE Der Support ist auf FOR ALL COLUMNS.
  • Spaltenreihenfolge oder Konfigurationsänderungen können eine vollständige Aktualisierung erfordern.