Sei sulla pagina 1di 25

SQL PERFORMANCE & TUNING

7. Gli Hint

Atos, Atos and fish symbol, Atos Origin and fish symbol, Atos Consulting, and the fish symbol itself are registered trademarks of Atos Origin SA. 30 December 2021
© 2006 Atos Origin. Private for the client. This report or any part of it, may not be copied, circulated, quoted without prior written approval from Atos Origin or the
client.
Obiettivi

In questo paragrafo verranno affrontati i seguenti argomenti:


 Gli Hint ed il loro utilizzo
 I diversi tipi di Hint

2 Custom presentation- or document control name


Definizione di hint

 Un hint è un “suggerimento” per l’ottimizzatore.


 Attraverso l’uso degli hint è possibile scecificare un
insieme di dettagli sulle modalità in cui deve essere eseguito
lo statement.

3 Custom presentation- or document control name


A cosa servono gli hint

Attraverso l’uso di hint è possibile scegliere:


 l’ottimizzatore
 il “goal”
 le modalità di accesso ad i dati
 il tipo di join
 l’ordine di un join

4 Custom presentation- or document control name


Pro e Contro degli hint

Vantaggi:
 riduzione del tempo di parse
 guidano oracle a scegliere il piano di esecuzione voluto
 se errati vengono, semplicemente, ignorati

Svantaggi:
 non standard SQL

5 Custom presentation- or document control name


Come specificare un hint

Sintassi:

SELECT | INSERT | UPDATE | DELETE /*+ hints */


Nota: Si può specificare un insieme di hint, ogni hint deve


essere separato dall’altro da uno o più spazi/tab.

6 Custom presentation- or document control name


Hint per l’ottimizzatore

 CHOOSE
Permette all’ottimizzatore di scegliere tra il CBO ed il
RBO. L’ottimizzatore decide in base alla presenza o
meno di statistiche.
 RULE
Indica all’ottimizzatore di utilizzare il RBO.

7 Custom presentation- or document control name


Hint per il “goal”

 FIRST_ROWS
Indica all’ottimizzatore di utilizzare il CBO e di
scegliere tra tutti i piani di esecuzione quello che ha il
minore tempo di esecuzione per restituire tutte le
righe.
 ALL_ROWS
Indica all’ottimizzatore di utilizzare il CBO e di
scegliere tra tutti i piani di esecuzione quello che ha il
minore tempo di esecuzione per restituire la prima
riga.

8 Custom presentation- or document control name


Esempio (1) - come specificare il “goal”

SELECT /*+ ALL_ROWS */ a.empno, b.dname


FROM
emp a, dept b
WHERE
a.deptno = b.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT Optimizer=HINT: ALL_ROWS (Cost=3 Card=12 Bytes=192)
1 0 HASH JOIN (Cost=3 Card=12 Bytes=192)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=12 Bytes=60)

9 Custom presentation- or document control name


Esempio (2) - come specificare il “goal”

SELECT /*+ FIRST_ROWS */ a.empno, b.dname


FROM
emp a, dept b
WHERE
a.deptno = b.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT Optimizer=HINT: FIRST_ROWS (Cost=13 Card=1 Bytes=192)
1 0 NESTED LOOPS (Cost=13 Card=12 Bytes=192)
2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=12 Bytes=60)
3 1 TABLE ACCESS (BY IX ROWID) OF 'DEPT' (Cost=1 Card=4 Bytes=44)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

10 Custom presentation- or document control name


Hint per l’accesso ad i dati (1)

 FULL (<table> | <table-alias>)


Indica all’ottimizzatore di eseguire un FULL table
scan sulla tabella specificata.
 INDEX (<table> [<index-list>])
Indica all’ottimizzatore di utilizzare gli indici
specificati nell’hint.
 INDEX_ASC (<table> [<index-list>])
E’ identico al precedente (per default un indice viene
scansionato in ordine crescente).
 INDEX_DESC (<table> [<index-list>])
Indica all’ottimizzatore di utilizzare gli indici e di
scansionarli in ordine descescente.

11 Custom presentation- or document control name


Hint per l’accesso ad i dati (2)

 INDEX_FFS (<table> [<index-list>])


Indica all’ottimizzatore di effettuare un index-fast-
full-scan al posto di un full-table-scan.
 NO_INDEX (<table> [<index-list>])
Indica all’ottimizzatore di non utilizzare gli indici
specificati nell’hint.
 INDEX_COMBINE (<table> [<index-list>])
Indica all’ottimizzatore utilizzare gli indici bitmap
specificati nell’hint.

12 Custom presentation- or document control name


Esempio (1) - l’accesso ad i dati

SELECT /*+ INDEX_ASC (emp pk_emp) */ *


FROM emp
WHERE empno = 7844;

Execution Plan
----------------------------------------------------------
0 SELECT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=33)
1 0 TABLE ACCESS (BY IX ROWID) OF 'EMP' (Cost=1 Card=1 Bytes=33)
2 1 INDEX (UNIQUE SCAN) OF 'PK_EMP' (UNIQUE)

13 Custom presentation- or document control name


Esempio (2) - l’accesso ad i dati

SELECT /*+ FULL (emp) */ *


FROM emp
WHERE empno = 7844;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=33)
1 0 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=1 Bytes=33)

14 Custom presentation- or document control name


Esempio (3) - l’accesso ad i dati

SELECT /*+ FULL (emp) */ count(*)


FROM emp
WHERE empno BETWEEN 7521 AND 7902;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=3)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=10 Bytes=30)

15 Custom presentation- or document control name


Esempio (4) - l’accesso ad i dati

SELECT /*+ INDEX_FFS (emp pk_emp) */ count(*)


FROM emp
WHERE empno BETWEEN 7521 AND 7902

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=3)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'PK_EMP' (UNIQUE) (Cost=1 Card=10
Bytes=30)

16 Custom presentation- or document control name


Hint per il tipo di join

 USE_NL (<table> <table> ...)


Indica all’ottimizzatore di effettuare un nested-loop
join.
 USE_MERGE (<table> <table> ...)
Indica all’ottimizzatore di effettuare un sort-merge
join.
 USE_HASH (<table> <table> ...)
Indica all’ottimizzatore di effettuare un hash join.

17 Custom presentation- or document control name


Esempio (1) - tipo di join

SELECT /*+ USE_NL (a b) */ a.empno, a.ename, b.dname


FROM
emp a, dept b
WHERE
a.deptno = b.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=12 Bytes=252)
1 0 NESTED LOOPS (Cost=5 Card=12 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=12 Bytes=120)

18 Custom presentation- or document control name


Esempio (2) - tipo di join

SELECT /*+ USE_HASH (a b) */ a.empno, a.ename, b.dname


FROM
emp a, dept b
WHERE
a.deptno = b.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=12 Bytes=252)
1 0 HASH JOIN (Cost=3 Card=12 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=12 Bytes=120)

19 Custom presentation- or document control name


Esempio (3) - tipo di join

SELECT /*+ USE_MERGE (a b) */ a.empno, a.ename, b.dname


FROM
emp a, dept b
WHERE
a.deptno = b.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=12 Bytes=252)
1 0 MERGE JOIN (Cost=5 Card=12 Bytes=252)
2 1 TABLE ACCESS (BY IX ROWID) OF 'DEPT' (Cost=2 Card=4 Bytes=44)
3 2 INDEX (FULL SCAN) OF 'PK_DEPT' (UNIQUE) (Cost=1 Card=4)
4 1 SORT (JOIN) (Cost=2 Card=12 Bytes=120)
5 4 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=12 Bytes=120)

20 Custom presentation- or document control name


Hint per l’ordine di join

 ORDERED
Indica all’ottimizzatore di eseguire il join rispettando
l’ordine dato nella clausola FROM.
 LEADING (<table>)
Indica all’ottimizzatore di utilizzare la tabella data
come la prima nell’ordine di esecuzione del join.

21 Custom presentation- or document control name


Esempio - l’ordine di join

SELECT /*+ ORDERED USE_NL (a b) */ a.empno, a.ename, b.dname


FROM
emp a, dept b
WHERE
a.deptno = b.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13 Card=12 Bytes=252)
1 0 NESTED LOOPS (Cost=13 Card=12 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=12 Bytes=120)
3 1 TABLE ACCESS (BY IX ROWID) OF 'DEPT' (Cost=1 Card=4 Bytes=44)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

22 Custom presentation- or document control name


Altri Hint

 CACHE (<table>)
I blocchi recuperati durante un full-table-scan
vengono “caricati” nella buffer cache come MRU
(Most Recently Used). Ossia, vengono mantenuti
nella cache il più possibile.
 NOCACHE (<table>)
I blocchi recuperati durante un full-table-scan
vengono “caricati” nella buffer cache come LRU
(Least Recently Used). Questo è il default.

23 Custom presentation- or document control name


Osservazioni sull’uso degli hint

 L’uso di un qualsiasi hint (diverso dal ‘RULE’) implica


l’utilizzo del CBO.

24 Custom presentation- or document control name


Riepilogo

In questo paragrafo abbiamo visto:


 Gli Hint ed il loro utilizzo
 I diversi tipi di Hint

25 Custom presentation- or document control name

Potrebbero piacerti anche