Ottimizzatore basato sui costi

Spark SQL utilizza un ottimizzatore basato sul costo (CBO) per scegliere piani di query efficienti. Il CBO utilizza statistiche di tabelle e colonne, come la dimensione delle tabelle e la distribuzione dei dati, per stimare il costo dei piani alternativi e scegliere quello con il costo stimato più basso. Questo è ancora più importante per query con join multiple, dove un piano scarso può essere di ordini di grandezza più lento di uno buono.

Il CBO è abilitato di default, ma dipende dalle statistiche. Se le statistiche mancano o sono obsolete, il CBO potrebbe scegliere un ordine o una strategia di join inefficiente. Raccogli statistiche di tabelle e colonne e tienile aggiornate. Vedere Raccogli statistiche.

Procedure consigliate

Per aiutare il CBO a scegliere piani di interrogazione efficienti, segui queste pratiche:

  • Raccogli statistiche per le tabelle utilizzate nelle query multi-join. Se usi l'ottimizzazione predittiva sulle tabelle gestite del Catalogo Unity, le statistiche vengono raccolte per te. Consulta Raccogli statistiche.
  • Controlla i piani di query quando una query multi-join è più lenta del previsto. Le statistiche mancanti o inaccurate sono una causa comune. Vedere Verificare i piani di interrogazione.
  • Elimina le statistiche o disattiva il CBO solo per mitigare un problema specifico di pianificazione causato dalle statistiche. Vedi Disabilitare l'ottimizzatore basato sul costo.

Raccogliere statistiche

Per ottenere il massimo vantaggio dal CBO, è importante raccogliere sia statistiche di colonna che 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.

L'ottimizzazione predittiva esegue automaticamente ANALYZE, 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 ... STATISTICHE DI CALCOLO.

È possibile rimuovere le statistiche di Optimizer in modo che l'ottimizzatore non si basi più su di essi, ad esempio per attenuare un problema di pianificazione causato dalle statistiche. Vedere ANALYZE TABLE ... ELIMINARE LE STATISTICHE.

Verificare i piani di query

Esistono diversi modi per verificare il piano delle query.

EXPLAIN comando

Per verificare se il piano usa le statistiche, usare il comando EXPLAINSQL .

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.

In Databricks Runtime 16.0 e superiori, l'output del EXPLAIN comando elenca le tabelle di riferimento che contengono statistiche mancanti, parziali e complete, ad esempio:

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

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, rows output: 2,451,005 est: N/A ad esempio, indica che questo operatore produce circa 2M righe e non sono disponibili statistiche.

Buona stima

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.

Stima non valida

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.

Disabilita l'ottimizzatore basato sul costo

CBO è abilitato per impostazione predefinita. Disabiliti il CBO modificando il flag spark.sql.cbo.enabled.

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