Kostenbasierter Optimierer
Spark SQL kann einen kostenbasierten Optimierer (Cost-Based Optimizer, CBO) verwenden, um Abfragepläne zu verbessern. Dies ist besonders für Abfragen mit mehreren Joins nützlich. Damit dies funktioniert, ist es wichtig, Tabellen- und Spaltenstatistiken zu erfassen und auf dem neuesten Stand zu halten.
Erfassen von Statistiken
Um den vollen Nutzen aus dem CBO zu ziehen, ist es wichtig, sowohl Spaltenstatistiken als auch Tabellenstatistiken zu erfassen. Sie können den ANALYZE TABLE
Befehl verwenden, um Statistiken manuell zu sammeln.
Tipp
Führen Sie ANALYZE TABLE
nach dem Schreiben in die Tabelle aus, um die Statistiken auf dem neuesten Stand zu halten.
Verwenden Sie ANALYZE
Wichtig
Predictive optimization with ANALYZE
is in Public Preview. Sie enthält eine intelligente Statistiksammlung während der Schreibvorgänge. Verwenden Sie dieses Formular , um sich für die öffentliche Vorschau anzumelden.
Die Predictive Optimization wird automatisch ausgeführt ANALYZE
, ein Befehl zum Sammeln von Statistiken in verwalteten Tabellen im Unity-Katalog. Databricks empfiehlt die Aktivierung der prädiktiven Optimierung für alle verwalteten Tabellen in Unity Catalog, um die Datenwartung zu vereinfachen und die Speicherkosten zu senken. Siehe ANALYZE TABLE.
Überprüfen von Abfrageplänen
Es gibt mehrere Möglichkeiten, den Abfrageplan zu überprüfen.
EXPLAIN
-Befehl
Verwenden Sie die SQL-Befehle, um zu überprüfen, ob der Plan Statistiken verwendet.
- Databricks Runtime 7.x und höhere Versionen: EXPLAIN
Wenn Statistiken fehlen, ist der Abfrageplan möglicherweise nicht optimal.
== Optimized Logical Plan ==
Aggregate [s_store_sk], [s_store_sk, count(1) AS count(1)L], Statistics(sizeInBytes=20.0 B, rowCount=1, hints=none)
+- Project [s_store_sk], Statistics(sizeInBytes=18.5 MB, rowCount=1.62E+6, hints=none)
+- Join Inner, (d_date_sk = ss_sold_date_sk), Statistics(sizeInBytes=30.8 MB, rowCount=1.62E+6, hints=none)
:- Project [ss_sold_date_sk, s_store_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: +- Join Inner, (s_store_sk = ss_store_sk), Statistics(sizeInBytes=48.9 GB, rowCount=2.63E+9, hints=none)
: :- Project [ss_store_sk, ss_sold_date_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: : +- Filter (isnotnull(ss_store_sk) && isnotnull(ss_sold_date_sk)), Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: : +- Relation[ss_store_sk,ss_sold_date_sk] parquet, Statistics(sizeInBytes=134.6 GB, rowCount=2.88E+9, hints=none)
: +- Project [s_store_sk], Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
: +- Filter isnotnull(s_store_sk), Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
: +- Relation[s_store_sk] parquet, Statistics(sizeInBytes=88.0 KB, rowCount=1.00E+3, hints=none)
+- Project [d_date_sk], Statistics(sizeInBytes=12.0 B, rowCount=1, hints=none)
+- Filter ((((isnotnull(d_year) && isnotnull(d_date)) && (d_year = 2000)) && (d_date = 2000-12-31)) && isnotnull(d_date_sk)), Statistics(sizeInBytes=38.0 B, rowCount=1, hints=none)
+- Relation[d_date_sk,d_date,d_year] parquet, Statistics(sizeInBytes=1786.7 KB, rowCount=7.30E+4, hints=none)
Wichtig
Die Statistik rowCount
ist besonders für Abfragen mit mehreren Joins wichtig. Wenn rowCount
fehlt, bedeutet dies, dass nicht genügend Informationen zur Berechnung vorhanden sind (d. h., einige erforderliche Spalten verfügen nicht über Statistiken).
Spark SQL-Benutzeroberfläche
Verwenden Sie die Spark SQL UI-Seite, um den ausgeführten Plan und die Genauigkeit der Statistiken anzuzeigen.
Eine Zeile wie rows output: 2,451,005 est: N/A
bedeutet, dass dieser Operator ca. 2 Mio. Zeilen erzeugt und keine Statistiken verfügbar waren.
Eine Zeile wie rows output: 2,451,005 est: 1616404 (1X)
bedeutet, dass dieser Operator ca. 2 Mio. Zeilen erzeugt, während die Schätzung bei ca. 1,6 Mio. lag und der Schätzungsfehlerfaktor „1“ lautete.
Eine Zeile wie rows output: 2,451,005 est: 2626656323
bedeutet, dass dieser Operator ca. 2 Mio. Zeilen erzeugt, während die Schätzung 2 Bn. Zeilen betrug, sodass der Schätzungsfehlerfaktor „1000“ lautete.
Deaktivieren des kostenbasierten Optimierers
Der CBO ist standardmäßig aktiviert. Sie können den CBO deaktivieren, indem Sie das Flag spark.sql.cbo.enabled
ändern.
spark.conf.set("spark.sql.cbo.enabled", false)