Statistiken zum Data Warehousing in Fabric

Gilt für: SQL-Analyseendpunkt und Warehouse in Microsoft Fabric

Das Warehouse in Microsoft Fabric verwendet eine Abfrage-Engine, um einen Ausführungsplan für eine bestimmte SQL-Abfrage zu erstellen. Wenn Sie eine Abfrage übermitteln, versucht der Abfrageoptimierer, alle möglichen Pläne aufzulisten und die effizienteste Option auszuwählen. Um zu bestimmen, welcher Plan den geringsten Mehraufwand (E/A, CPU, Arbeitsspeicher) erfordert, muss die Engine in der Lage sein, den Arbeitsaufwand oder die Zeilen auszuwerten, die bei jedem Operator verarbeitet werden können. Anschließend wählt er basierend auf den Kosten jedes Plans den Plan mit dem geringsten geschätzten Arbeitsaufwand aus. Statistiken sind Objekte, die relevante Informationen zu Ihren Daten enthalten, damit der Abfrageoptimierer diese Kosten schätzen kann.

Nutzen von Statistiken

Um eine optimale Abfrageleistung zu erzielen, ist es wichtig, über genaue Statistiken zu verfügen. Microsoft Fabric unterstützt derzeit die folgenden Pfade, um relevante und aktuelle Statistiken bereitzustellen:

Manuelle Statistiken für alle Tabellen

Die herkömmliche Option zum Verwalten der Integrität von Statistiken ist in Microsoft Fabric verfügbar. Benutzer*innen können histogrammbasierte Einzelspaltenstatistiken erstellen (CREATE STATISTICS), aktualisieren (UPDATE STATISTICS) und löschen (DROP STATISTICS). Zudem können sie den Inhalt histogrammbasierter Einzelspaltenstatistiken mithilfe von DBCC SHOW_STATISTICS anzeigen. Derzeit wird eine eingeschränkte Version dieser Anweisungen unterstützt.

  • Wenn Sie Statistiken manuell erstellen, sollten Sie sich auf diejenigen konzentrieren, die in Ihrer Abfrageworkload häufig verwendet werden (insbesondere GROUP BY-, ORDER BY- und JOIN-Anweisungen sowie Filter).
  • Erwägen Sie, Statistiken auf Spaltenebene regelmäßig nach Datenänderungen zu aktualisieren, die die Zeilenanzahl oder Verteilung der Daten erheblich ändern.

Beispiele für die manuelle Statistikverwaltung

Erstellen von Statistiken für die dbo.DimCustomer-Tabelle basierend auf allen Zeilen in einer CustomerKey-Spalte:

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

Manuelles Aktualisieren des Statistikobjekts DimCustomer_CustomerKey_FullScan (ggf. nach einer umfangreichen Datenaktualisierung):

UPDATE STATISTICS dbo.DimCustomer (DimCustomer_CustomerKey_FullScan) WITH FULLSCAN;  

Anzeigen von Informationen zum Statistikobjekt:

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

Anzeigen nur von Informationen zum Histogramm des Statistikobjekts:

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

Manuelles Löschen des Statistikobjekts DimCustomer_CustomerKey_FullScan:

DROP STATISTICS dbo.DimCustomer.DimCustomer_CustomerKey_FullScan;

Die folgenden T-SQL-Objekte können auch verwendet werden, um manuell und automatisch erstellte Statistiken in Microsoft Fabric zu überprüfen:

Automatische Statistiken bei Abfrage

Wenn Sie eine Abfrage ausgeben und der Abfrageoptimierer Statistiken für die Planuntersuchung benötigt, erstellt Microsoft Fabric diese Statistiken automatisch, wenn sie noch nicht vorhanden sind. Nachdem Statistiken erstellt wurden, kann der Abfrageoptimierer sie verwenden, um die Plankosten der auslösenden Abfrage zu schätzen. Wenn die Abfrage-Engine feststellt, dass vorhandene, für die Abfrage relevante Statistiken die Daten nicht mehr genau widerspiegeln, werden diese Statistiken automatisch aktualisiert. Da diese automatischen Vorgänge synchron ausgeführt werden, können Sie davon ausgehen, dass die Abfragedauer diese Zeit einschließt, wenn die benötigten Statistiken noch nicht vorhanden sind oder seit der letzten Statistikaktualisierung erhebliche Änderungen an den Daten vorgenommen wurden.

Überprüfen der automatischen Statistiken zur Abfragezeit

Es gibt verschiedene Fälle, in denen Sie eine Art von automatischen Statistiken erwarten können. Am häufigsten werden histogrammbasierte Statistiken verwendet, die vom Abfrageoptimierer für Spalten angefordert werden, auf die in GROUP BY-, JOIN-, DISTINCT- und ORDER BY-Klauseln sowie Filtern (WHERE-Klauseln) verwiesen wird. Wenn noch keine Statistiken für COLUMN_NAME vorhanden sind und Sie beispielsweise die automatische Erstellung dieser Statistiken anzeigen möchten, wird die Erstellung einer Abfrage ausgelöst. Beispiel:

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

In diesem Fall sollten Sie davon ausgehen, dass Statistiken für COLUMN_NAME erstellt wurden. Wenn die Spalte auch eine varchar-Spalte war, werden auch Statistiken zur durchschnittlichen Spaltenlänge erstellt. Wenn Sie überprüfen möchten, ob Statistiken automatisch erstellt wurden, können Sie die folgende Abfrage ausführen:

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 
INNER JOIN sys.stats_columns AS sc 
ON s.object_id = sc.object_id 
AND s.stats_id = sc.stats_id 
INNER 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;

Diese Abfrage sucht nur nach spaltenbasierten Statistiken. Wenn Sie alle Statistiken anzeigen möchten, die für diese Tabelle vorhanden sind, entfernen Sie die JOIN-Anweisungen für sys.stats_columns und sys.columns.

Nun können Sie den statistics_name der automatisch generierten Histogrammstatistik (sollte etwa _WA_Sys_00000007_3B75D760 lauten) suchen und den folgenden T-SQL-Code ausführen:

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

Beispiel:

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

Der Updated-Wert im Resultset von DBCC SHOW_STATISTICS sollte ein Datum (in UTC) sein (ähnlich wie beim Ausführen der ursprünglichen GROUP BY-Abfrage).

Diese automatisch generierten Statistiken können dann von der Abfrage-Engine in nachfolgenden Abfragen genutzt werden, um die Plankosten zu reduzieren und die Ausführungseffizienz zu verbessern. Wenn genügend Änderungen in der Tabelle vorliegen, aktualisiert die Abfrage-Engine auch diese Statistiken, um die Abfrageleistung zu verbessern. Das gleiche Beispiel kann auch nach einer erheblichen Änderung der Tabelle durchgeführt werden. In Fabric verwendet die SQL-Abfrage-Engine denselben Schwellenwert für die Neukompilierung wie in SQL Server 2016 (13.x), um Statistiken zu aktualisieren.

Arten automatisch generierter Statistiken

In Microsoft Fabric gibt es mehrere Arten von Statistiken, die automatisch von der Engine generiert werden, um Abfragepläne zu verbessern. Derzeit sind sie in sys.stats zu finden, obwohl nicht alle handlungsrelevant sind:

  • Histogrammstatistiken
    • Diese Statistiken werden für jede Spalte erstellt, die zur Abfragezeit Histogrammstatistiken erfordert.
    • Diese Objekte enthalten Histogramm- und Dichteinformationen zur Verteilung einer bestimmten Spalte. Sie ähneln den Statistiken, die in dedizierten Azure Synapse Analytics-Pools automatisch zur Abfragezeit erstellt werden.
    • Der Name beginnt mit _WA_Sys_.
    • Inhalte können mit DBCC-SHOW_STATISTICS angezeigt werden.
  • Statistiken zur durchschnittlichen Spaltenlänge
    • Werden zum Abfragezeitpunkt für Spalten mit mehr als 100 variablen Zeichen (varchar) erstellt, bei denen eine durchschnittliche Spaltenlänge erforderlich ist
    • Diese Objekte enthalten einen Wert, der die durchschnittliche Zeilengröße der varchar-Spalte zum Zeitpunkt der Erstellung von Statistiken darstellt.
    • Der Name beginnt mit ACE-AverageColumnLength_.
    • Inhalte können nicht angezeigt werden und sind für Benutzer*innen nicht handlungsrelevant.
  • Tabellenbasierte Kardinalitätsstatistiken
    • Diese Statistiken werden für jede Tabelle erstellt, die zur Abfragezeit eine Kardinalitätsschätzung benötigt.
    • Diese Objekte enthalten eine Schätzung der Zeilenanzahl einer Tabelle.
    • Der Name lautet ACE-Cardinality.
    • Inhalte können nicht angezeigt werden und sind für Benutzer*innen nicht handlungsrelevant.

Begrenzungen

  • Nur einspaltige Histogrammstatistiken können manuell erstellt und geändert werden.
  • Die Erstellung von mehrspaltigen Statistiken wird nicht unterstützt.
  • Andere Statistikobjekte können in sys.stats neben manuell und automatisch erstellten Statistiken angezeigt werden. Diese Objekte werden nicht für die Abfrageoptimierung verwendet.