Sdílet prostřednictvím


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 statistiky udržovat aktuální, spusťte ANALYZE TABLE po zápisu do tabulky.

Použití ANALYZE

Důležité

Prediktivní optimalizace ve ANALYZE verzi Public Preview. Zahrnuje inteligentní shromažďování statistik během zápisů. Pomocí tohoto formuláře se zaregistrujte do verze Public Preview.

Prediktivní optimalizace se automaticky spustí ANALYZE– příkaz pro shromažďování statistik ve spravovaných tabulkách Katalogu 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 FUNKCE ANALYZOVAT TABULKU.

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.

Chybějící odhad

Řá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.

Dobrý odhad

Řá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.

Chybný odhad

Řá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)