Le modalità di ottimizzazione

Consigli Oracle di Burleson Consulting

All’interno di questi due ottimizzatori, Oracle offre diverse modalità di ottimizzazione. È possibile impostare una modalità di ottimizzazione per l’intero database o per una sessione Oracle specifica. Le modalità di ottimizzazione includono rule, first_rows, all_rows e choose. Diamo uno sguardo più da vicino a ciascuno di questi obiettivi.

Modalità regola

Il suggerimento regola ignorerà il CBO e le statistiche e genererà un piano di esecuzione basato esclusivamente sulle informazioni di base del dizionario dei dati. È sempre una buona idea provare a sintonizzare una specifica istruzione SQL utilizzando l’RBO utilizzando un suggerimento di regola o emettendo la regola alter session set optimizer_goal=. Tuttavia, ricorda sempre che l’RBO può scegliere un indice meno ideale per servire una query.
Optimizer_mode = scegli

La modalità scegli ottimizzatore consente a Oracle di scegliere l’obiettivo di ottimizzazione più appropriato. Questa è la modalità di ottimizzazione predefinita all’interno di Oracle e generalmente utilizza la presenza di statistiche per determinare quale ottimizzatore richiamare. Se non esistono statistiche, Oracle utilizzerà l’obiettivo regola. Se esistono statistiche, Oracle sceglierà first_rows o all_rows, a seconda della presenza di indici e dell’impostazione per parallelismo e db_file_multiblock_read_count.

Attenzione: avere statistiche incomplete con la modalità choose optimizer può causare enormi rallentamenti. Se Oracle rileva una singola tabella in una query con statistiche, utilizzerà l’ottimizzatore basato sui costi e calcolerà le statistiche per le altre tabelle in fase di esecuzione. Ciò può causare un enorme rallentamento dell’esecuzione SQL. Questo problema è molto comune con i principianti di Oracle Remote DBA perché la modalità predefinita è choose e perché i DBA remoti principianti a volte emettono selettivamente il comando analyze, non rendendosi conto che stanno effettuando i tempi di esecuzione SQL.
modalità first_rows

Questa è una modalità di ottimizzazione basata sui costi che restituirà le righe il prima possibile, anche se la query complessiva viene eseguita più a lungo o consuma più risorse. La modalità di ottimizzazione first_rows di solito comporta la scelta di una scansione a indice completo su una scansione a tabella completa parallela. Poiché la modalità first_rows favorisce le scansioni degli indici rispetto alle scansioni a tabella intera, la modalità first_rows è più appropriata per i sistemi online in cui l’utente finale desidera visualizzare alcuni risultati il più rapidamente possibile.
modalità all_rows

Questa è una modalità di ottimizzazione basata sui costi che garantisce che il tempo complessivo di query sia ridotto al minimo, anche se richiede più tempo per ricevere la prima riga. Questo di solito comporta la scelta di una scansione a tabella completa parallela su una scansione a indice completo. Poiché la modalità all_rows favorisce le scansioni complete della tabella, la modalità all_rows è più adatta per le query orientate ai batch in cui non sono richieste righe intermedie per la visualizzazione.
Che è “migliore”? Esecuzione rapida e utilizzo minimo delle risorse.

Per comprendere la filosofia di Oracle per quanto riguarda l’esecuzione veloce e il consumo minimo di risorse abbiamo bisogno di guardare un semplice esempio. Per illustrare la differenza tra all_rows e first_rows con una semplicistica esempio, si consideri la seguente query:

selezionare
cognome
da
cliente
order by
cognome;

Questa query può essere eseguita in due modi:

  • Full table scan – Qui ci si eseguire un full table scan in parallelo e ordinare le righe in TEMP tablespace. Per motivi illustrativi, supponiamo che questo piano di esecuzione produca il tempo di esecuzione complessivo più veloce e un utilizzo minimo delle risorse (Figura 2).

Figura 2: Eseguire una scansione completa della tabella e un ordinamento (all_rows)

  • Full Index scan – Qui recuperiamo le righe in ordine last_name utilizzando un last_name_index. Questa tecnica si traduce in letture più fisiche, ma inizia a restituire righe ordinate quasi immediatamente (Figura 3).

Figura 3: Eseguire nuovamente un recupero dell’indice(first_rows)

, supponendo che accettiamo la scansione completa della tabella e l’ordinamento sia meno intensivo di I/O rispetto alla scansione completa dell’indice, quindi possiamo vedere chiaramente la differenza negli obiettivi dell’ottimizzatore. La scansione dell’indice completo inizierà a restituire le righe quasi immediatamente a scapito di I / O aggiuntivi, mentre la scansione della tabella completa richiederà meno risorse, ma il set di risultati non sarà disponibile fino alla fine della query.

Questo è un estratto da “Oracle High-Performance SQL Tuning” di Donald K. Burleson, pubblicato da Oracle Press.

Write a Comment

Il tuo indirizzo email non sarà pubblicato.