Ottimizzatore basato sui costi
Spark SQL può usare un ottimizzatore basato sui costi (CBO) per migliorare i piani di query. Ciò è particolarmente utile per le query con più join. Per il 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 delle tabelle. È possibile usare il ANALYZE TABLE
comando per raccogliere manualmente le statistiche.
Suggerimento
Per mantenere aggiornate le statistiche, eseguire ANALYZE TABLE
dopo la scrittura nella tabella.
Utilizzare ANALYZE
.
Importante
L'ottimizzazione predittiva con ANALYZE
è disponibile in anteprima pubblica. Include una raccolta di statistiche intelligenti durante le scritture. Usare questo modulo per iscriversi all'anteprima pubblica.
L'ottimizzazione predittiva esegue ANALYZE
automaticamente , un comando per la raccolta di statistiche nelle tabelle gestite di Unity Catalog. Databricks consiglia di abilitare l'ottimizzazione predittiva per tutte le tabelle gestite di Unity Catalog per semplificare la manutenzione dei dati e ridurre i costi di archiviazione. Vedere ANALYZE TABLE.
Verificare i piani di query
Esistono diversi modi per verificare il piano di query.
EXPLAIN
comando
Per verificare se il piano usa le statistiche, usare i comandi SQL
- Databricks Runtime 7.x e versioni successive: EXPLAIN
Se mancano statistiche, 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 calcolarlo, 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.
Una riga, rows output: 2,451,005 est: N/A
ad esempio, indica che questo operatore produce circa 2M righe e non sono disponibili statistiche.
Una linea, rows output: 2,451,005 est: 1616404 (1X)
ad esempio, indica che questo operatore produce circa 2 milioni di righe, mentre la stima era approssimativa di 1,6 M e il fattore di errore di stima era 1.
Una riga, ad esempio rows output: 2,451,005 est: 2626656323
, indica che questo operatore produce circa 2 milioni di righe mentre la stima era di 2B righe, quindi il fattore di errore di stima era 1000.
Disabilitare l'ottimizzatore basato sui costi
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)