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 zachovat statistiky up-to-date, spusťte po zápisu do tabulky ANALYZE TABLE.

Použití ANALYZE

Prediktivní optimalizace automaticky spouští příkaz ANALYZEpro 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.

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)