Freigeben über


Optimieren von Delta Lake-Tabellen mit V-Order

Das Tabellenformat Lakehouse und Delta Lake sind für Microsoft Fabric zentral. Die Optimierung von Delta-Tabellen ist der Schlüssel zur Leistung und Kosteneffizienz für Analyseworkloads.

Dieser Artikel hilft Ihnen bei der Entscheidung, wann V-Order verwendet werden soll, und zeigt die wichtigsten Konfigurations- und Wartungsmuster für Delta-Tabellen an.

Verwenden Sie diesen Artikel, um:

  • Verstehen, welche Änderungen der V-Order erfahren und wann dies nützlich ist.
  • Verstehen, wie Z-Order und V-Order einander ergänzen.
  • Wählen Sie die richtige Steuerungsebene aus: Sitzung, Tabelleneigenschaft oder Schreibvorgang.
  • Wenden Sie Wartungsmuster für Delta-Tabellen im richtigen Spark-Laufzeitkontext an.

Anleitungen für die arbeitslastübergreifende Anwendung von V-Order basierend auf Nutzungsszenarien finden Sie unter "Arbeitslastübergreifende Tabellenwartung und Optimierung".

Was ist mit V-Reihenfolge gemeint?

V-Order ist eine Schreibzeitoptimierung für Parquet-Dateien, die die Leistung nachgelagerter Abfragen über Fabric-Engines hinweg verbessern kann.

Auf einen Blick:

  • Wo es am meisten hilft: Leseintensive Muster wie Dashboarding, interaktive Analysen und wiederholte Scans.
  • Wie es hilft: Ordnen Sie das Layout von Parkett (z. B. Zeilengruppenverteilung, Codierung und Komprimierung) neu an, um die Leseeffizienz zu verbessern.
  • Typischer Kompromiss: Schreibvorgänge können länger dauern (häufig etwa 15% im Durchschnitt), während Lesevorgänge je nach Arbeitsauslastung erheblich verbessert werden können.
  • Engine-Kompatibilität: Dateien bleiben Open-Source-Parquet-konform, und Delta-Funktionen wie Z-Order bleiben kompatibel.
  • Umfang: V-Order ist Dateiebene. Delta-Operationen wie Komprimierung, Vakuum und Zeitreisen können damit verwendet werden.

Steuern von V-Order-Schreibvorgängen

V-Order wird verwendet, um das Layout der Parquet-Datei für eine schnellere Abfrageleistung zu optimieren, insbesondere in leselastigen Szenarien. In Microsoft Fabric ist V-Order standardmäßig für alle neu erstellten Arbeitsbereiche deaktiviert , um die Leistung für schreibintensive Datenverarbeitungsworkloads zu optimieren.

Das V-Order-Verhalten in Apache Spark wird über die folgenden Konfigurationen gesteuert:

Konfiguration Standardwert Beschreibung
spark.sql.parquet.vorder.default false Steuert das Schreiben der V-Order auf Sitzungsebene. Standardmäßig auf false in neuen Fabric-Arbeitsbereichen festgelegt.
TBLPROPERTIES("delta.parquet.vorder.enabled") Nicht festgelegt Steuert das Standardverhalten der V-Reihenfolge auf Tabellenebene.
DataFrame Writer-Option: parquet.vorder.enabled Nicht festgelegt Wird zum Steuern der V-Reihenfolge auf Schreibvorgangsebene verwendet.

Verwenden Sie die folgenden Befehle, um V-Order-Schreibvorgänge nach Bedarf für Ihr Szenario zu aktivieren oder außer Kraft zu setzen.

V-Order ist in neuen Fabric-Arbeitsbereichen (spark.sql.parquet.vorder.default=false) standardmäßig deaktiviert, um die Schreibleistung für Aufnahme- und Transformationspipelines zu verbessern.

Aktivieren Sie für leseintensive Workloads wie interaktive Abfragen oder Dashboard-Erstellung die V-Order, indem Sie spark.sql.parquet.vorder.default auf true setzen. Sie können auch zu readHeavyforSpark oder ReadHeavy Ressourcen-Profilen wechseln, die V-Order automatisch für eine leseoptimierte Leistung aktivieren.

In Fabric Runtime 1.3 und höher wird die spark.sql.parquet.vorder.enable Einstellung entfernt. Da V-Order während der Delta-Optimierung mit OPTIMIZE automatisch angewendet werden kann, benötigen Sie diese ältere Einstellung nicht. Wenn Sie aus früheren Laufzeitversionen migrieren, entfernen Sie diese Einstellung aus Ihrem Code.

Überprüfen der Konfiguration der V-Reihenfolge in einer Apache Spark-Sitzung

Verwenden Sie diese Befehle, um den aktuellen Sitzungswert zu bestätigen, bevor Sie ihn ändern.

%%sql 
SET spark.sql.parquet.vorder.default 

Deaktivierung des V-Order-Schreibvorgangs in einer Apache Spark-Sitzung

Verwenden Sie diese Befehle, wenn Ihre Workload schreibgelastet ist und Sie schnellere Erfassungs- oder Transformations-Schreibvorgänge wünschen.

%%sql 
SET spark.sql.parquet.vorder.default=FALSE 

Aktivieren Sie das Schreiben in V-Reihenfolge in der Apache Spark-Sitzung

Wenn Sie V-Order auf Sitzungsebene aktivieren, verwenden alle Parquet-Schreibvorgänge in dieser Sitzung V-Order, einschließlich Nicht-Delta-Parquet-Tabellen und Delta-Tabellen, auch wenn parquet.vorder.enabled explizit auf false festgelegt ist.

%%sql 
SET spark.sql.parquet.vorder.default=TRUE 

Steuern der V-Reihenfolge mit Delta-Tabelleneigenschaften

In diesem Abschnitt wird Spark SQL nur verwendet, weil Tabelleneigenschaften über SQL DDL und ALTER TABLE Anweisungen definiert werden.

Verwenden Sie Tabelleneigenschaften, wenn Sie einen Standard auf Tabellenebene wünschen, der für alle Sitzungen gilt.

Aktivieren Sie die V-Order-Tabelleneigenschaft während der Tabellenerstellung.

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

Wenn die Tabelleneigenschaft auf true, INSERT, UPDATE und MERGE festgelegt ist, wird zum Zeitpunkt des Schreibvorgangs die V-Order angewendet. Einstellungen auf Sitzungsebene und Schreibebene haben weiterhin Vorrang, sodass Schreibvorgänge auch dann die V-Reihenfolge verwenden können, wenn auf gesetzt ist.

Aktivieren oder deaktivieren Sie die V-Reihenfolge, indem Sie die Tabelleneigenschaft ändern:

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

Wenn Sie V-Reihenfolge mithilfe von Tabelleneigenschaften aktivieren oder deaktivieren, sind nur zukünftige Schreibvorgänge in die Tabelle von der Änderung betroffen. Parquet-Dateien behalten die Reihenfolge bei, die bei ihrer Erstellung verwendet wurde. Informationen zum Ändern der aktuellen physischen Struktur zum Anwenden oder Entfernen der V-Reihenfolge finden Sie unter Steuern der V-Reihenfolge beim Optimieren einer Tabelle.

Direktes Steuern der V-Reihenfolge bei Schreibvorgängen

In diesem Abschnitt wird PySpark verwendet, um die DataFrame Writer-API zu veranschaulichen. Das gleiche Muster ist in Scala DataFrame-APIs mit entsprechenden Optionen verfügbar.

Verwenden Sie Optionen auf Schreibebene, wenn Sie eine Steuerung pro Vorgang anstelle von sitzungsweiten oder tabellenweiten Standardeinstellungen benötigen.

Alle Apache Spark-Schreibbefehle erben die Sitzungseinstellung, wenn sie nicht explizit außer Kraft gesetzt wird. In den folgenden Beispielen wird in V-Reihenfolge geschrieben, indem die Sitzungskonfiguration übernommen wird.

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .saveAsTable("myschema.mytable") 

Die V-Reihenfolge gilt nur für Dateien, die durch das Prädikat bestimmt werden.

In einer Sitzung, in der spark.sql.parquet.vorder.default die Einstellung aufgehoben oder festgelegt falseist, schreiben die folgenden Befehle mit V-Reihenfolge:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .option("parquet.vorder.enabled","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()

Was ist Optimize Write?

Analytische Spark-Workloads sind in der Regel besser, wenn Die Dateigrößen konsistenter sind und die Dateianzahl niedriger ist. Ingestion-Pipelines erzeugen oft viele kleine Dateien, was zu einem häufig auftretenden kleinen Dateiproblem führt.

Optimize Write ist ein Delta Lake-Feature in Fabric und Synapse, das die Anzahl der Dateien reduziert und die einzelne Dateigröße bei Schreibvorgängen in Apache Spark erhöht. Die Zieldateigröße kann je nach Workloadanforderungen mithilfe von Konfigurationen geändert werden.

Das Feature ist in Microsoft Fabric Runtime für Apache Sparkstandardmäßig aktiviert. Weitere Informationen zu Verwendungsszenarien für „Optimize Write“ finden Sie im Artikel Die Notwendigkeit der Optimierung von Schreibvorgängen in Apache Spark.

Zusammenführungsoptimierung

Delta Lake MERGE aktualisiert eine Zieltabelle aus einer Quelltabelle, Ansicht oder DataFrame. In Open-Source-Delta Lake kann MERGE unnötige Shuffle-Arbeit auf unveränderte Zeilen entfallen. Die Fabric-Laufzeit umfasst die Optimierung von "Low Shuffle Merge", um diesen Aufwand zu reduzieren.

Die Implementierung wird von spark.microsoft.delta.merge.lowShuffle.enabled gesteuert und ist zur Laufzeit standardmäßig aktiviert. Es erfordert keine Codeänderungen und bleibt mit open-source Delta Lake kompatibel. Weitere Informationen finden Sie unter Optimierung von Low Shuffle Merge in Delta-Tabellen.

Wartung von Delta-Tabellen

Wenn sich Delta-Tabellen weiterentwickeln, kann die Leistung und die Speichereffizienz aus mehreren Gründen beeinträchtigt werden:

  • Neu der Tabelle hinzugefügte Daten können Daten verzerren.
  • Batch- und Streamingdatenerfassungsraten können viele kleine Dateien mit sich bringen.
  • Aktualisierungs- und Löschvorgänge fügen Leseaufwand hinzu, da Parkettdateien unveränderlich sind und Delta neue Dateien für Änderungen schreibt.
  • Ältere Daten und Protokolldateien können sich im Speicher ansammeln.

Um Tabellen gesund zu halten, verwenden Sie regelmäßig Komprimierungs- und Bereinigungsvorgänge.

  • OPTIMIZE führt eine Dateikompaktierung durch, indem Änderungen in größere Parquet-Dateien zusammengefasst werden.
  • VACUUM entfernt abgeleitete Dateien aus dem Speicher.

Tipp

Verwenden Sie die Delta-Tabellenwartung in Lakehouse für den portalbasierten Wartungsworkflow, führen Sie Überwachungsleitlinien und aufbewahrungsorientierte Betriebsanleitungen durch.

OPTIMIZE und VACUUM sind Spark SQL-Befehle. Starten Sie sie:

Diese Befehle werden im SQL Analytics-Endpunkt - oder Warehouse-SQL-Abfrage-Editor nicht unterstützt, der nur T-SQL unterstützt. Verwenden Sie für SQL-Endpunktworkflows die Delta Lake-Tabellenwartung , oder führen Sie die Befehle in einem Fabric-Notizbuch aus.

Entwerfen Sie zuerst die physische Struktur der Tabelle basierend auf aufnahmehäufigkeit und Lesemustern. In vielen Workloads hat der Tabellenentwurf mehr Einfluss als Optimierungsbefehle allein.

Steuerung der V-Reihenfolge beim Optimieren einer Tabelle

Verwenden Sie diese Befehle, um die Komprimierung und das Umschreiben der V-Reihenfolge in einem einzigen Vorgang durchzuführen.

Z-Order und V-Order optimieren verschiedene Aspekte der Leseleistung:

  • Z-Order (SQL-SchlüsselwortZORDER) clustert verwandte Werte zusammen, um das Überspringen von Daten für selektive Filter zu verbessern.
  • V-Order (SQL-SchlüsselwortVORDER) optimiert das Layout der Parquet-Datei, um die Leseeffizienz für Fabric-Engines zu verbessern.

Wenn Ihre Abfragen häufig nach bestimmten Spalten filtern, kann Z-Order hilfreich sein. Wenn Ihre Arbeitslast insgesamt leseintensiv ist, kann V-Order helfen. In vielen Fällen können Sie beide kombinieren.

Verwenden Sie dieses Schnellentscheidungshandbuch:

  • Verwenden Sie VORDER, wenn Sie umfassende Verbesserungen bei der Leseleistung über alle Engines hinweg wünschen.
  • Verwenden Sie ZORDER BY (...) mit VORDER, wenn Abfragen wiederholt auf bekannte Spalten filtern und die Vorteile des V-Order-Layouts nutzen möchten.

Der folgende Befehl formatiert bin-compact und überschreibt alle betroffenen Dateien unter Verwendung der V-Order, unabhängig von TBLPROPERTIES den Sitzungseinstellungen:

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER BY (col_name1, col_name2, ...)] VORDER;

Wenn ZORDER und VORDER in SQL zusammen verwendet werden, wendet Apache Spark die Bin-Komprimierung, dann Z-Order und dann V-Order an.

Die folgenden Befehle bin-kompakt und überschreiben alle betroffenen Dateien mit TBLPROPERTIES. Wenn TBLPROPERTIES für die Aktivierung von V-Order festgelegt ist, werden alle betroffenen Dateien mit V-Order geschrieben. Wenn TBLPROPERTIES nicht festgelegt ist oder auf false gesetzt ist, übernimmt das Verhalten die Sitzungseinstellung. Um V-Order aus Tabellenumschreibungen zu entfernen, legen Sie die Sitzungskonfiguration auf false.

Wenn Sie diese Befehle in Fabric-Notizbüchern ausführen, fügen Sie ein Leerzeichen zwischen %%sql und OPTIMIZE ein.

Richtige Syntax:

%%sql 
OPTIMIZE table_name;

Falsche Syntax: %%sqlOPTIMIZE table_name;.

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];

Verwenden Sie VACUUM für Aufbewahrung und Speicherbereinigung.

Ein häufiges VACUUM Szenario ist die aufbewahrungsbasierte Bereinigung. Verwenden Sie diese Methode, wenn ältere, nicht referenzierte Dateien angesammelt wurden und Sie nach Updates, Löschvorgängen oder wiederholten Aufnahmezyklen Speicher freigeben möchten.

Führen Sie VACUUM nur mit einem Aufbewahrungsfenster aus, das Ihren Erwartungen hinsichtlich Zeitreise und Wiederherstellung entspricht. Die Standardkonfiguration speichert sieben Tage Verlauf.

In Spark-Notizbüchern sieht ein kompaktes VACUUM Muster wie folgt aus:

%%sql
VACUUM schema_name.table_name;

VACUUM schema_name.table_name RETAIN 168 HOURS;

Anweisungen zum Aufbewahrungsverhalten und zur Sicherheit finden Sie unter VAKUUM-Befehl. Informationen zu programmgesteuerten Wartungsläufen finden Sie unter Ausführen der Tabellenwartung in einer Delta-Tabelle.