Oracle Database
suggerimenti
Ricerca…
Parametri
parametri | Dettagli |
---|---|
Grado di parallelismo (DOP) | È il numero di connessioni / processi paralleli a cui si desidera aprire la query. Di solito è 2, 4, 8, 16 così via. |
Nome tabella | Il nome della tabella su cui verrà applicato il suggerimento parallelo. |
Suggerimento parallelo
I suggerimenti paralleli a livello di istruzione sono i più semplici:
SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;
I suggerimenti paralleli a livello di oggetto danno più controllo, ma sono più inclini agli errori; gli sviluppatori spesso dimenticano di usare l'alias al posto del nome dell'oggetto o dimenticano di includere alcuni oggetti.
SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;
SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;
Diciamo che una query impiega 100 secondi per eseguire senza utilizzare il suggerimento parallelo. Se cambiamo DOP a 2 per la stessa query, idealmente la stessa query con hint parallelo richiederà 50 secondi. Allo stesso modo usare DOP come 4 richiederà 25 secondi.
In pratica, l'esecuzione parallela dipende da molti altri fattori e non si scala linearmente. Ciò è particolarmente vero per i piccoli tempi di esecuzione in cui il sovraccarico parallelo può essere maggiore dei guadagni derivanti dall'esecuzione in più server paralleli.
USE_NL
Usa cicli annidati.
Uso: use_nl(AB)
Questo suggerimento chiederà al motore di utilizzare il metodo loop annidato per unire le tabelle A e B. Questo è il confronto riga per riga. Il suggerimento non forza l'ordine del join, richiede solo NL.
SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
APPENDICE SUGGERIMENTO
"Usa il metodo DIRECT PATH per inserire nuove righe".
Il suggerimento APPEND
indica al motore di utilizzare il carico del percorso diretto . Ciò significa che il motore non utilizzerà un inserto convenzionale utilizzando strutture di memoria e serrature standard, ma scriverà direttamente nel tablespace i dati. Crea sempre nuovi blocchi che vengono aggiunti al segmento della tabella. Questo sarà più veloce, ma presenta alcuni limiti:
- Non è possibile leggere dalla tabella aggiunta alla stessa sessione finché non si impegna o si esegue il rollback della transazione.
- Se ci sono trigger definiti nella tabella, Oracle non utilizzerà il percorso diretto (è una storia diversa per i carichi sqlldr).
- altri
Esempio.
INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;
USE_HASH
Indica al motore di utilizzare il metodo hash per unire le tabelle nell'argomento.
Uso: use_hash(TableA [TableB] ... [TableN])
Come spiegato in molti punti , "in un join Hash, Oracle accede a una tabella (in genere il più piccolo dei risultati uniti) e crea una tabella hash sulla chiave join in memoria, quindi esegue la scansione dell'altra tabella nel join (in genere il più grande uno) e controlla la tabella hash per le corrispondenze. "
È preferibile rispetto al metodo Nested Loops quando le tabelle sono grandi, non ci sono indici disponibili, ecc.
Nota : il suggerimento non forza l'ordine del join, richiede solo il metodo HASH JOIN.
Esempio di utilizzo:
SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
PIENO
L'hint FULL indica a Oracle di eseguire una scansione completa della tabella su una tabella specificata, non importa se è possibile utilizzare un indice.
create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);
Senza suggerimenti, viene utilizzato l'indice:
select count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | INDEX RANGE SCAN| IDX | 2 | 26 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
L'hint FULL forza una scansione completa:
select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 47 (3)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | TABLE ACCESS FULL| FULLTABLE | 2 | 26 | 47 (3)| 00:00:01 |
--------------------------------------------------------------------------------
Cache dei risultati
Oracle ( 11g e versioni successive ) consente alle query SQL di essere memorizzate nella cache nell'SGA e riutilizzate per migliorare le prestazioni. Interroga i dati dalla cache anziché dal database. L'esecuzione successiva della stessa query è più veloce perché ora i dati vengono estratti dalla cache.
SELECT /*+ result_cache */ number FROM main_table;
Produzione -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
Se ora eseguo di nuovo la stessa query, il tempo di esecuzione si ridurrà poiché i dati vengono ora recuperati dalla cache che è stata impostata durante la prima esecuzione.
Produzione -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
Notare come il tempo trascorso si è ridotto da 2,20 secondi a 0,10 secondi .
Cache dei risultati conserva la cache finché i dati nel database non vengono aggiornati / modificati / eliminati. Qualsiasi modifica rilascerà la cache.