Oracle utilizza un ottimizzatore SQL molto sofisticato e potente che e' in grado di eseguire query molto complesse. Tuttavia qualche volta l'ottimizzatore di Oracle ha bisogno di un suggerimento: questa breve paginetta riporta alcune indicazioni per usare gli HINT in Oracle.
L'SQL e' un linguaggio di quarta generazione,
ovvero consente di dire cosa si vuole
ma non come trovarlo.
Gli statement SQL vengono parsificati
(che e' una semplice verifica sintattica e sull'accesso ai dati)
e quindi vengono analizzati dall'optimizer. L'optimizer ha il compito
di decidere quale sia i modo migliore per estrarre i dati richiesti.
L'optimizer Oracle e' cost based,
ovvero utilizza le statistiche disponibili sulle
tabelle e sugli indici e sofisticati algoritmi per elaborare un plan (piano di esecuzione) ottimizzato
dell'SQL richiesto
[NdA l'ottimizzatore RBO (Rule Based Optimizer) non e' piu' supportato dalla 10.2
e comunque l'ottimizzatore CBO (CBO Based Optimizer),
introdotto nella 7.0 (1992) era da tempo preferito].
Nonostante le informazioni raccolte tuttavia qualche volta l'ottimizzatore non trova il piano d'esecuzione migliore per eseguire uno statement ed e' possibile suggerire un consiglio con la sintassi degli HINT.
Gli HINT sono una feature non standard SQL di Oracle... ma molti altri RDBMS li hanno imitati! Dal punto di vista sintattico gli hint sono molto semplici perche' si tratta di commenti con l'aggiunta del segno + e dell'indicazione del commento. Quindi se all'interno sono errati o vengono eseguiti su una base dati che non li supporta semplicemente non succede nulla!
Ecco la semplice sintassi di un HINT:
SELECT /*+ HINT */ ...
Facciamo ora qualche semplice esempio:
L'hint e' un'indicazione su come eseguire uno statement SQL.
Nel primo esempio e' suggerito di eseguire una FULL TABLE SCAN sulla tabella.
E' possibile indicare piu' hint in sucessione ed ORDERED indica che vanno svolti
nell'ordine indicato.
Alcuni suggerimenti richiedono dei parametri come il nome della tabella o dell'indice
che vanno indicati tra parentesi.
Se e' presente va usato l'eventuale alias della tabella.
L'elenco degli HINT puo' essere suddiviso in categorie:
-- Optimization Goal ALL_ROWS FIRST_ROWS(n) -- Access Path FULL ROWID CLUSTER HASH INDEX INDEX_ASC INDEX_COMBINE INDEX_JOIN INDEX_DESC INDEX_FFS INDEX_SS INDEX_SS_ASC INDEX_SS_DESC AND_EQUAL -- Query Transformation NO_QUERY_TRANSFORMATION USE_CONCAT NO_EXPAND REWRITE EXPAND_GSET_TO_UNION MERGE STAR_TRANSFORMATION FACT UNNEST -- Join Order LEADING ORDERED STAR -- Join Operations USE_NL USE_NL_WITH_INDEX USE_MERGE USE_HASH DRIVING_SITE HASH_AJ, MERGE_AJ, and NL_AJ HASH_SJ, MERGE_SJ, and NL_SJ -- Parallel Execution PARALLEL NOPARALLEL PQ_DISTRIBUTE PARALLEL_INDEX NO_PARALLEL_INDEX -- Additional APPEND NOAPPEND CACHE NOCACHE PUSH_PRED PUSH_SUBQ QB_NAME ORDERED_PREDICATES CURSOR_SHARING_EXACT DRIVING_SITE DYNAMIC_SAMPLING MODEL_MIN_ANALYSIS
Oltre agli hint indicati vi e' una serie di hint con il prefisso NO_ che indicano di non usare l'operazione indicata [NdA nell'elenco ne sono riportati alcuni perche' non hanno la versione in positivo].
In realta' il trucco sono gli HINT!
Pero' e' vero che vi sono altri modi per indirizzare l'ottimizzatore a fare la scelta giusta
nel creare il piano d'esecuzione.
E' possibibile alterare il comportamento dell'ottimizzatore di Oracle mediante:
In questa paginetta abbiamo visto l'utilizzo degli HINT
ma e' assolutamente da riportare che con un ottimizzatore cost based
la raccolta e la gestione delle statistiche sulle tabelle e sugli indici
e' fondamentale perche' vengano trovati i migliori execution path,
almeno nella maggioranza dei casi.
Ecco come raccogliere le statistiche su uno schema:
exec DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');
Infine da ultimo, ma certo non come importanza perche' sono la prima cosa, il disegno logico ed il disegno fisico di un database relazionale sono il punto di partenza di un progetto efficiente e con buone prestazioni.
Pur mantenendo la stessa logica sono significative le differenze tra le versioni di Oracle. Anche gli HINT sono cambiati e cresciuti in numero nel tempo: 9.2, 10gR2, 11g, 11gR2, ...
Titolo: Oracle HINTs
Livello: Avanzato
Data: 1 Aprile 2003
Versione: 1.0.2 -
31 Ottobre 2013 🎃
Autore:
mail [AT] meo.bogliolo.name