Op kosten gebaseerde optimaliseerder
Spark SQL kan een op kosten gebaseerde optimalisatie (CBO) gebruiken om queryplannen te verbeteren. Dit is vooral handig voor query's met meerdere joins. Dit werkt alleen als u tabel- en kolomstatistieken verzamelt en up-to-date houdt.
Statistieken verzamelen
Om het volledige voordeel van de CBO te krijgen, is het belangrijk om zowel kolomstatistieken als tabelstatistieken te verzamelen. Statistieken kunnen worden verzameld met behulp van de opdracht ANALYZE TABLE.
Tip
Als u de statistieken up-to-date wilt houden, voert u deze uit ANALYZE TABLE
na het schrijven naar de tabel.
Queryplannen controleren
Er zijn verschillende manieren om het queryplan te controleren.
EXPLAIN
opdracht
Als u wilt controleren of het plan statistieken gebruikt, gebruikt u de SQL-opdrachten
- Databricks Runtime 7.x en hoger: UITLEG
Als er statistieken ontbreken, is het queryplan mogelijk niet optimaal.
== 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)
Belangrijk
De rowCount
statistiek is vooral belangrijk voor query's met meerdere joins. Als rowCount
er ontbreekt, betekent dit dat er onvoldoende informatie is om deze te berekenen (dat wil zeggen dat sommige vereiste kolommen geen statistieken hebben).
Spark SQL-gebruikersinterface
Gebruik de pagina Spark SQL UI om het uitgevoerde plan en de nauwkeurigheid van de statistieken te bekijken.
Een lijn zoals rows output: 2,451,005 est: N/A
betekent dat deze operator ongeveer 2 miljoen rijen produceert en dat er geen statistieken beschikbaar waren.
Een lijn zoals rows output: 2,451,005 est: 1616404 (1X)
betekent dat deze operator ongeveer 2 miljoen rijen produceert, terwijl de schatting ongeveer 1,6 miljoen was en de schattingsfoutfactor 1 was.
Een lijn zoals rows output: 2,451,005 est: 2626656323
betekent dat deze operator ongeveer 2 miljoen rijen produceert terwijl de schatting 2B-rijen was, dus de schattingsfoutfactor was 1000.
De optimalisatie op basis van kosten uitschakelen
De CBO is standaard ingeschakeld. U schakelt de CBO uit door de spark.sql.cbo.enabled
vlag te wijzigen.
spark.conf.set("spark.sql.cbo.enabled", false)
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor