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. Om dit te doen, is het essentieel om table en column statistieken te verzamelen en up-to-date te houden.
Statistieken verzamelen
Om het volledige voordeel van de CBO te get, is het belangrijk om zowel column statistieken als table statistiekente verzamelen. U kunt de ANALYZE TABLE
opdracht gebruiken om handmatig statistieken te verzamelen.
Tip
Om de statistieken up-toup-to-date te houden, voert u ANALYZE TABLE
uit nadat u naar de tablehebt geschreven.
ANALYZE
gebruiken
Belangrijk
Voorspellende optimalisatie met ANALYZE
bevindt zich in openbare preview. Het bevat intelligente verzameling statistieken tijdens schrijfbewerkingen. Gebruik dit formulier om u aan te melden voor de openbare preview.
Voorspellende optimalisatie voert automatisch ANALYZE
uit, een opdracht die statistieken verzamelt, op Unity Catalog beheerde tables. Databricks raadt aan voorspellende optimalisatie in te schakelen voor alle door Unity Catalog beheerde tables om het onderhoud van gegevens te vereenvoudigen en de opslagkosten te verlagen. Zie ANALYZE TABLE.
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: EXPLAIN
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
ontbreekt, betekent dit dat er onvoldoende informatie is om deze te berekenen (dat wil zeggen, sommige vereiste columns 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)