Freigeben über


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. Statistiken können mit dem Befehl ANALYZE TABLE erfasst werden.

Tipp

Führen Sie ANALYZE TABLE nach dem Schreiben in die Tabelle aus, um die Statistiken auf dem neuesten Stand zu halten.

Ü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.

Fehlende Schätzung

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.

Gute Schätzung

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.

Schlechte Schätzung

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)