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