Dela via


Kostnadsbaserad optimering

Spark SQL kan använda en kostnadsbaserad optimering (CBO) för att förbättra frågeplaner. Detta är särskilt användbart för frågor med flera kopplingar. För att detta ska fungera är det viktigt att samla in tabell- och kolumnstatistik och hålla dem uppdaterade.

Samla in statistik

För att få full nytta av CBO är det viktigt att samla in både kolumnstatistik och tabellstatistik. Du kan använda ANALYZE TABLE kommandot för att manuellt samla in statistik.

Dricks

För att hålla statistiken up-touppdaterad, kör ANALYZE TABLE efter att du har skrivit till tabellen.

Använda ANALYZE

Viktigt!

Förutsägelseoptimering med ANALYZE finns i offentlig förhandsversion. Den innehåller intelligent statistikinsamling under skrivningar. Använd det här formuläret för att registrera dig för den offentliga förhandsversionen.

Förutsägande optimering kör automatiskt ANALYZE, ett kommando för att samla in statistik, på Unity Catalogs hanterade tabeller. Databricks rekommenderar att du aktiverar förutsägande optimering för alla hanterade Unity Catalog-tabeller för att förenkla dataunderhållet och minska lagringskostnaderna. Se ANALYZE TABLE.

Verifiera frågeplaner

Det finns flera sätt att verifiera frågeplanen.

EXPLAIN kommando`

Om du vill kontrollera om planen använder statistik använder du SQL-kommandona

  • Databricks Runtime 7.x och senare: EXPLAIN

Om statistik saknas kanske frågeplanen inte är 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)

Viktigt!

Statistiken rowCount är särskilt viktig för frågor med flera kopplingar. Om rowCount saknas innebär det att det inte finns tillräckligt med information för att beräkna den (det vill säga att vissa obligatoriska kolumner inte har statistik).

Spark SQL-användargränssnitt

Använd spark SQL-användargränssnittssidan för att se den utförda planen och noggrannheten i statistiken.

Uppskattning saknas

En rad som rows output: 2,451,005 est: N/A innebär att den här operatorn producerar cirka 2 miljoner rader och att det inte fanns någon tillgänglig statistik.

Bra uppskattning

En linje som rows output: 2,451,005 est: 1616404 (1X) innebär att den här operatorn producerar cirka 2 miljoner rader, medan uppskattningen var cirka 1,6 miljoner och uppskattningsfelfaktorn var 1.

Felaktig uppskattning

En rad som rows output: 2,451,005 est: 2626656323 innebär att den här operatorn producerar cirka 2 M rader medan uppskattningen var 2B rader, så uppskattningsfelfaktorn var 1 000.

Inaktivera den kostnadsbaserade optimeraren

CBO är aktiverat som standard. Du inaktiverar CBO genom att spark.sql.cbo.enabled ändra flaggan.

spark.conf.set("spark.sql.cbo.enabled", false)