Ottimizzatore basato sui costi

Spark SQL può usare un ottimizzatore basato sui costi per migliorare i piani di query. Ciò è particolarmente utile per le query con più join. Per consentire questo funzionamento, è fondamentale raccogliere statistiche di tabella e colonna e mantenerle aggiornate.

Raccogliere statistiche

Per ottenere il massimo vantaggio dell'oggetto CBO, è importante raccogliere statistiche di colonna e statistiche di tabella. Le statistiche possono essere raccolte usando il comando ANALYZE TABLE.

Suggerimento

Per mantenere aggiornate le statistiche, eseguire ANALYZE TABLE dopo la scrittura nella tabella.

Verificare i piani di query

Esistono diversi modi per verificare il piano di query.

Comando EXPLAIN

Per verificare se il piano usa le statistiche, usare i comandi SQL

  • Databricks Runtime 7.x e versioni successive: EXPLAIN

Se le statistiche mancano, il piano di query potrebbe non essere ottimale.

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

Importante

La rowCount statistica è particolarmente importante per le query con più join. Se rowCount manca, significa che non sono disponibili informazioni sufficienti per calcolarla, ovvero alcune colonne obbligatorie non dispongono di statistiche.

Interfaccia utente di Spark SQL

Usare la pagina dell'interfaccia utente di Spark SQL per visualizzare il piano eseguito e l'accuratezza delle statistiche.

Stima mancante

Una riga, ad rows output: 2,451,005 est: N/A esempio, indica che questo operatore produce circa 2 milioni di righe e non sono disponibili statistiche.

Buona stima Buona

Una linea, ad rows output: 2,451,005 est: 1616404 (1X) esempio, indica che questo operatore produce circa 2 milioni di righe, mentre la stima è di circa 1,6 M e il fattore di errore di stima è 1.

Stima errata

Una riga, ad rows output: 2,451,005 est: 2626656323 esempio, indica che questo operatore produce circa 2 milioni di righe mentre la stima era di 2B righe, quindi il fattore di errore di stima è 1000.

Disabilitare Cost-Based Optimizer

L'oggetto CBO è abilitato per impostazione predefinita. Disabilitare l'oggetto CBO modificando il spark.sql.cbo.enabled flag.

spark.conf.set("spark.sql.cbo.enabled", false)