Delen via


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 ANALYZEuit, 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.

Ontbrekende schatting

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.

Goede schatting

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.

Onjuiste schatting

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)