Optimalizátor založený na nákladech

Spark SQL může pomocí optimalizátoru nákladů (CBO) vylepšovat plány dotazů. To je užitečné zejména pro dotazy s více spojeními. Aby to fungovalo, je důležité shromažďovat statistiky tabulek a sloupců a udržovat je v aktualizovaném stavu.

Shromažďování statistik

Pokud chcete získat plnou výhodu CBO, je důležité shromáždit statistiky sloupců i statistiky tabulek. Statistiky je možné shromažďovat pomocí příkazu ANALYZOVAT TABULKU.

Tip

Pokud chcete udržovat statistiky aktuální, spusťte ANALYZE TABLE po zápisu do tabulky příkaz .

Ověření plánů dotazů

Existuje několik způsobů, jak ověřit plán dotazu.

EXPLAIN Příkaz

Pokud chcete zkontrolovat, jestli plán používá statistiku, použijte příkazy SQL.

  • Databricks Runtime 7.x a novější: EXPLAIN

Pokud chybí statistika, 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 není dostatek informací pro výpočet (to znamená, že některé požadované sloupce nemají statistiku).

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.

Chybějící odhad

Například čára rows output: 2,451,005 est: N/A znamená, že tento operátor vytvoří přibližně 2M řádků a nejsou k dispozici žádné statistiky.

Dobrý odhad

Například čára rows output: 2,451,005 est: 1616404 (1X) znamená, že tento operátor vytvoří přibližně 2M řádků, zatímco odhad byl přibližně 1,6 min. a faktor chyby odhadu byl 1.

Chybný odhad

Například čára rows output: 2,451,005 est: 2626656323 znamená, že tento operátor vytvoří přibližně 2M řádků, zatímco odhad byl 2B řádků, takže faktor chyby odhadu byl 1000.

Zakázání optimalizátoru Cost-Based

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)