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. Statistiky je možné shromažďovat pomocí příkazu ANALYZE TABLE.
Tip
Pokud chcete statistiky udržovat aktuální, spusťte ANALYZE TABLE
po zápisu do tabulky.
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 pro výpočet není dostatek informací (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)
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro