Hints

Page last edited 2 037 giorni 15 ore fa
Da wiki.betaingegneria.it.

Uso dei Suggerimenti per l'Ottimizzatore (Optimizer Hints)[modifica]

Questa sezione è tratta dalla sezione 16 del Sito Oracle.

Piccola auto-introduzione[modifica]

Oracle usa uno strumento (Optimizer) per eseguire le interrogazioni (query) nel modo più efficiente possibile. Ciò significa che se, ad esempio, devo tirare fuori dati da due tabelle in join, filtrando per un campo di tabella1 e per un altro di tabella2, se - ad esempio - uno di questi due campi è indicizzato ma ha milioni di righe, mentre l'altro campo non è indicizzato ma ci sono solo due righe, probabilmente sarà più veloce la query che cerca prima sulla tabella piccola e poi per join sulla tabella grande. Dipende dal fatto che ci siano indici, dalle dimensioni dei blocchi ed altre condizioni.

L'ottimizzatore, in base a dei criteri statistici, stabilisce autonomamente in quale ordine delle join o dei filtri il risultato sarà raggiunto nel più breve tempo.

Esistono casi in cui, per la specifica fattezza dei dati, di solito noto all'analista e al progettista del database, si possono individuare criteri di ricerca ancora più efficienti di quelli che elaborerebbe l'ottimizzatore, per cui è possibile forzare l'ottimizzatore, tramite delle istruzioni, a cambiare il proprio piano di esecuzione in base a questi criteri forzati.

Queste istruzioni/direttive prendono il nome di suggerimenti o hints.

L'Hint di ottimizzazione può essere utilizzato con le istruzioni SQL per modificare i piani di esecuzione (Execution Plans). Questo capitolo spiega come utilizzare i suggerimenti per istruire l'ottimizzatore ad utilizzare approcci specifici.

Il capitolo contiene le seguenti sezioni:

  • comprendere i suggerimenti per l'Ottimizzatore
  • specificare i suggerimenti
  • utilizzo degli hint con le viste

Comprendere i suggerimenti per l'Ottimizzatore[modifica]

I suggerimenti (hints) consentono di prendere decisioni che di solito vengono prese autonomamente dall'ottimizzatore. Come progettisti dell'applicazione, probabilmente si hanno informazioni sui dati che l'ottimizzatore non ha. I suggerimenti forniscono un meccanismo per istruire l'ottimizzatore a scegliere un determinato piano di esecuzione query in base ai criteri specifici.

Per esempio, è possibile che si sappia che un indice è certamente più selettivo per determinate query. Sulla base di queste informazioni, si potrebbe essere in grado di scegliere un piano di esecuzione più efficiente dell'ottimizzatore. In tal caso, utilizziamo i parametri per istruire l'ottimizzatore su come utilizzare il piano ottimale di esecuzione.


Nota: L'uso dei suggerimenti comporta codice aggiuntivo che deve essere gestito, verificato e controllato.


Tipi di Suggerimenti[modifica]

I suggerimenti possono essere dei seguenti tipi generali:

Sulla singola tabella
I suggerimenti sulla singola tabella sono indicati su una tabella o vista. INDEX e USE_NL sono esempi di suggerimenti sulla singola tabella.
Multi-tabella
i suggerimenti multi-tabella sono come i suggerimenti a tabella singola, solo che il suggerimento si può specificare in una o più tabelle o viste. LEADER è un esempio di suggerimento multi-tabella. Si noti che USE_NL (tabella1 tabella2) non è considerata un suggerimento multi-tabella perché in realtà è una scorciatoia per USE_NL (tabella1) e USE_NL (tabella2).
A livello di blocco della query
Suggerimenti blocco query operare su blocchi singola query. STAR_TRANSFORMATION e UNNEST sono esempi di suggerimenti blocco query.
Istruzione
le istruzioni di suggerimento si applicano all'intera istruzione SQL. ALL_ROWS è un esempio istruzione di suggerimento.
Suggerimenti per categoria[modifica]

Gli hint di ottimizzazione sono raggruppati nelle seguenti categorie:

  • Suggerimenti per le strategie di ottimizzazione e Obiettivi
  • Suggerimenti per percorsi di accesso
  • Suggerimenti per trasformazioni di query
  • Suggerimenti per ordinamento di join
  • Suggerimenti per operazioni di join
  • Suggerimenti per esecuzione parallela
  • Suggerimenti aggiuntivi

Queste categorie, ed i suggerimenti contenuti all'interno di ciascuna categoria, sono elencati nelle sezioni che seguono.

Suggerimenti per le strategie di ottimizzazione e Obiettivi[modifica]

I seguenti suggerimenti consentono di scegliere tra gli approcci di ottimizzazione e obiettivi:

  • ALL_ROWS
  • FIRST_ROWS (n)

Se un'istruzione SQL è un suggerimento che specifica sia un metodo di ottimizzazione che l'obiettivo, l'ottimizzatore utilizzerà l'approccio indicato, indipendentemente dalla presenza o meno di statistiche, il valore del parametro di inizializzazione OPTIMIZER_MODE e il parametro OPTIMIZER_MODE della dichiarazione ALTER SESSION.


Nota: L'obiettivo di ottimizzazione si applica solo alle query lanciate direttamente. Utilizzate i parametri per specificare il percorso di accesso per tutte le istruzioni SQL inviate dall'interno del PL/SQL. L'istruzione ALTER SESSION ... SET OPTIMIZER_MODE non influisce sull'SQL che viene eseguito all'interno del PL/SQL.


Se si specifica sia il suggerimento ALL_ROWS che il suggerimento FIRST_ROWS (n) in un'istruzione SQL, e se il dizionario dei dati non ha statistiche sulle tabelle a cui accede l'istruzione, l'ottimizzatore utilizzerà i valori di default delle statistiche, come lo spazio di memoria allocato per tali tabelle, per la stima dei dati mancanti e la scelta successiva di un piano di esecuzione. Queste stime potrebbero non essere accurate come quelle raccolte dal pacchetto DBMS_STATS; infatti si dovrebbe usare il pacchetto DBMS_STATS per raccogliere le statistiche.

Se si specificano suggerimenti per percorsi di accesso di operazioni di join in congiunzione sia con l'hint ALL_ROWS che con l'hint FIRST_ROWS (n), allora l'ottimizzatore privilegerà i percorsi di accesso e le operazioni di join specificate dal suggerimento.

Vedere "Approcci di ottimizzazione e suggerimenti di obiettivo nelle viste" per il comportamento degli hint con le viste mescolabili (mergeable).

Hints for Access Paths[modifica]

Ciascuno dei seguenti suggerimenti istruisce l'ottimizzatore ad utilizzare uno specifico percorso di accesso per una tabella:

  • FULL
  • CLUSTER
  • HASH
  • INDEX
  • NO_INDEX
  • INDEX_ASC
  • INDEX_COMBINE
  • INDEX_JOIN
  • INDEX_DESC
  • INDEX_FFS
  • NO_INDEX_FFS
  • INDEX_SS
  • INDEX_SS_ASC
  • INDEX_SS_DESC
  • NO_INDEX_SS

Specificando uno di questi suggerimenti si costringe l'ottimizzatore a scegliere il percorso di accesso specificato solo se il percorso di accesso è disponibile basandosi sull'esistenza di un indice o cluster e sui costrutti sintattici dell'istruzione SQL. Se un suggerimento specifica un percorso di accesso non disponibile, l'ottimizzatore lo ignora.

È necessario specificare la tabella a cui accedere, esattamente come appare nella dichiarazione. Se l'istruzione usa un alias per la tabella, allora utilizzate l'alias e non il nome della tabella nel suggerimento. Il nome della tabella all'interno del suggerimento non dovrebbe includere il nome dello schema, se il nome dello schema è presente nella dichiarazione.

Vedere "Percorsi di accesso e suggerimenti sulle Viste" e "Percorsi di accesso e suggerimenti all'interno delle Viste" per il comportamento con viste mescolabili.


Nota: Per suggerimenti di percorso di accesso, Oracle ignora il suggerimento se si specifica l'opzione SAMPLE nella clausola FROM di un'istruzione SELECT.


Vedi anche: Oracle Database SQL Language Reference per ulteriori informazioni sull'opzione SAMPLE