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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow