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 propojení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

Abyste udrželi statistiky aktuální, spusťte ANALYZE TABLE po zápisu do tabulky.

Použít 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 ... VÝPOČETNÍ STATISTIKA.

Ověřte plány dotazů

Plán dotazů můžete ověřit několika způsoby.

EXPLAIN příkaz

Pokud chcete zkontrolovat, jestli plán používá statistiky, použijte příkaz EXPLAINSQL .

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).

Výstup příkazu EXPLAIN v Databricks Runtime 16.0 a vyšších uvádí odkazované tabulky s chybějícími, částečnými a úplnými statistikami, jak ukazuje následující příklad výstupu:

== Optimizer Statistics (table names per statistics state) ==
  missing = date_dim, store
  partial =
  full    = store_sales
Corrective actions: consider running the following command on all tables with missing or partial statistics
  ANALYZE TABLE <table-name> COMPUTE STATISTICS FOR ALL COLUMNS

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 řádků, přičemž odhad byl přibližně 1,6M a faktor odhadu chyby byl 1.

Chybný odhad

Řádek jako rows output: 2,451,005 est: 2626656323 znamená, že tento operátor vytváří přibližně 2 miliony řádků, zatímco odhad byl 2 miliardy řádků, takže chybový faktor odhadu 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)