Una interessante caratteristica del
database Oracle è la possibilità di inserire, all'interno dei propri
statement SQL, dei
suggerimenti per il
query optimizer, noti come
hint. La
documentazione ufficiale invita ad usare questi suggerimenti con parsimonia, ma vi possono essere casi in cui si possono ottenere migliori piani di esecuzione proprio grazie ai pratici
hint, ad esempio in presenza di statistiche non aggiornabili, sulle quali viene basato l'
execution plan.
Per inserire un suggerimento all'interno di una
select basta introdurre, subito dopo tale parola chiave, un commento racchiuso tra i classici simboli
/*+ e
*/, contenente l'
hint stesso, come in questo esempio:
<span style="font-size:1.0em">
SELECT /*+FIRST_ROWS*/ ...
</span>
In
questo articolo di
Steve Callan viene proposto uno schema riassuntivo di tutti i suggerimenti disponibili nel
database Oracle 11g, ben 71 escludendo i
deprecated, organizzati per categorie.
Alcuni di questi
hint possono effettivamente fornire all'ottimizzatore delle informazioni in più rispetto all'obiettivo che vogliamo raggiungere con una nostra
query: ad esempio
ALL_ROWS e
FIRST_ROWS indicheranno rispettivamente la necessità di operare su tutte le righe, oppure di disporre delle prime nel minor tempo possibile, consentendo al
query optimizer di scegliere il piano di esecuzione più opportuno in base anche a tale informazione.
Come scrive
Thomas Kyte nella prima risposta di
questo post,
quando il numero di hint nelle nostre applicazioni prolifera, occorre chiedersi cosa c'è che non va, in quanto significa che stiamo
“riscrivendo un Rule Based Optimizer”, come quello presente da Oracle 6 in poi e
deprecated nella versione 10g del database, impedendo al
query optimizer di utilizzare i nuovi strumenti automatici messi a disposizione per il miglioramento delle performance:
“a questo punto sarebbe meglio non avere alcun ottimizzatore” - conclude
Kyte.
Nell'articolo di Steve Callan viene anche mostrato come, in un caso reale, il cattivo utilizzo di
hint e di tabelle
over-indexed abbiano portato ad un evidente problema di performance del database.