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

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)