Optimalizátor založený na nákladech
Spark SQL může ke zlepšení plánů dotazů použít optimalizátor založený na nákladech (CBO). To je užitečné zejména pro dotazy s více spojeními. Aby to fungovalo, je důležité shromáždit statistiky tabulek a sloupců a udržovat je v aktualizovaném stavu.
Shromažďování statistik
Abyste získali plnou výhodu CBO, je důležité shromáždit statistiky sloupců i statistiky tabulek . Pomocí příkazu můžete ANALYZE TABLE
ručně shromažďovat statistiky.
Tip
Pokud chcete zachovat statistiky up-to-date, spusťte po zápisu do tabulky ANALYZE TABLE
.
Použití ANALYZE
Prediktivní optimalizace automaticky spouští příkaz ANALYZE
pro shromažďování statistik v tabulkách spravovaných Katalogem Unity. Databricks doporučuje povolit prediktivní optimalizaci pro všechny spravované tabulky Katalogu Unity, aby se zjednodušila údržba dat a snížily náklady na úložiště. Viz ANALYZE TABLE.
Ověření plánů dotazů
Plán dotazů můžete ověřit několika způsoby.
Příkaz EXPLAIN
Pokud chcete zkontrolovat, jestli plán používá statistiky, použijte příkazy SQL.
- Databricks Runtime 7.x a novější: EXPLAIN
Pokud statistiky chybí, nemusí být plán dotazu optimální.
== 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)
Důležité
Statistika rowCount
je obzvláště důležitá pro dotazy s více spojeními. Pokud rowCount
chybí, znamená to, že neexistuje dostatek informací k výpočtu (to znamená, že některé požadované sloupce nemají statistiky).
Uživatelské rozhraní Spark SQL
Na stránce uživatelského rozhraní Spark SQL můžete zobrazit spuštěný plán a přesnost statistiky.
Řádek, například rows output: 2,451,005 est: N/A
znamená, že tento operátor vytváří přibližně 2M řádky a nebyly k dispozici žádné statistiky.
Řádek, například rows output: 2,451,005 est: 1616404 (1X)
znamená, že tento operátor vytváří přibližně 2M řádky, zatímco odhad byl přibližně 1,6M a odhad chybový faktor byl 1.
Řádek, například rows output: 2,451,005 est: 2626656323
znamená, že tento operátor vytváří přibližně 2M řádky, zatímco odhad byl 2B řádků, takže odhad chybový faktor byl 1 000.
Zakázání optimalizátoru založeného na nákladech
CBO je ve výchozím nastavení povolené. CBO zakážete změnou příznaku spark.sql.cbo.enabled
.
spark.conf.set("spark.sql.cbo.enabled", false)