Oracle
 sql >> Database >  >> RDS >> Oracle

Hash join in Oracle con esempio

Sommario

Cos'è hash Join in Oracle?

Gli hash join vengono utilizzati quando si uniscono tabelle di grandi dimensioni o quando i join richiedono la maggior parte delle righe delle tabelle unite. Viene utilizzato solo per i join di uguaglianza

Algoritmo per Oracle Hash Join

1) L'ottimizzatore utilizza una delle 2 tabelle più piccole per creare una tabella hash in memoria. La tabella piccola è chiamata build table

Fase di costruzione

Per ogni riga nel ciclo di una piccola tabella
Calcola il valore hash sulla chiave di join
Inserisci la riga nel bucket hash appropriato.
End loop;

2) quindi esegue la scansione delle tabelle grandi e confronta il valore hash (delle righe di una tabella grande) con questa tabella hash per trovare le righe unite. La tabella grande è chiamata tabella sonda

Fase della sonda

Per ogni riga nel ciclo della tabella grande
Calcola il valore hash sulla chiave di unione
Esamina il valore hash nella tabella hash
Se è stata trovata una corrispondenza
Restituisci le righe
Fine ciclo;

La spiegazione di cui sopra è vera quando la tabella hash in fase di sviluppo si adatta interamente alla memoria. Se la tabella hash è troppo grande per adattarsi alla memoria disponibile, Oracle esegue l'elaborazione in modo leggermente diverso. troppo grande per stare nella memoria disponibile Oracle ha un meccanismo per salvarlo su disco in batch (chiamati partizioni) e salvare la tabella della sonda su disco in batch corrispondenti, quindi eseguire il pezzo di unione tra batch corrispondenti

Fondamentalmente quando l'area hash si riempie, Oracle richiederà di utilizzare il tablespace TEMP. Oracle sceglierà la partizione più grande con nell'hash e la scriverà su TEMP.Oracle mantiene in memoria un indice simile a una bitmap dell'intera tabella hash. Questo indice sa solo che per un determinato bucket di hash (posizione nella tabella hash) esiste o meno un valore. Ma l'indice non ha il valore effettivo.

Quindi, se una riga dalla seconda o dalla tabella di sondaggio esegue gli hash in una di queste posizioni, l'unica cosa nota è che esiste una potenziale corrispondenza. Il processo di creazione della tabella hash continua fino al completamento dell'intera tabella hash. Parte della tabella hash è in memoria e una parte è su disco

Ora Oracle inizia a leggere il probe o un'altra tabella e inizia a creare l'hash della chiave di join. Se la chiave hash corrisponde all'hash in memoria, il join viene completato e viene restituita la riga. Se la riga è la potenziale corrispondenza, Oracle memorizzerà questa riga nel tablespace TEMP nello stesso schema di partizionamento in cui sono stati conservati i dati della prima riga.

Una volta terminato il primo passaggio dell'intera tabella secondaria e fornite tutte le righe nella tabella hash in memoria, Oracle inizierà a guardare la partizione corrispondente nel disco ed elaborerà ciascuna partizione una per una e leggerà le righe nella memoria ed elaborare l'output

Esempio di hash join Oracle:

select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;
Plan
-------------------------------------------------
SELECT STATEMENT
HASH JOIN
TABLE ACCESS FULL EMP
TABLE ACCESS FULL DEPT

Come viene elaborato l'hash join in Oracle
1) La prima tabella EMP viene scansionata e sottoposta a hash
2) la tabella dept viene scansionata per ogni riga e viene creato l'hash per il mantenimento del join dept_no
3) l'hash dept_no viene abbinato nella tabella hash , se viene trovata una corrispondenza, vengono restituite le righe unite

Suggerimento per l'iscrizione all'hash Oracle 

Oracle ha fornito il suggerimento use_hash per forzare l'uso di hash join.

Usage

select /* +use_hash(table alias) */ ......

Questo dice all'ottimizzatore che il metodo di join da utilizzare quando "table_alias" è l'origine della riga successiva nell'ordine di join dovrebbe essere un hash join; tuttavia non dice all'ottimizzatore se quella riga di origine deve essere utilizzata come tabella di compilazione o come tabella di analisi.

Per specificare come viene utilizzata l'origine riga è necessario un secondo suggerimento:no_swap_join_inputs ("table_alias") se si desidera che Oracle utilizzi il rowsource come tabella probe, o swap_join_inputs ("table_alias") se si desidera che Oracle lo utilizzi come build tabella

Alcuni punti importanti sull'hash join in Oracle

1) L'output del risultato dell'hash join non è istantaneo poiché l'hash join è bloccato durante la creazione della tabella hash. Una volta completata la creazione della tabella hash, le righe vengono restituite più velocemente
2) gli hash join sono comunemente visti con ALL_ROWS ottimizzatore modalità, perché funziona su un modello di visualizzazione dei risultati dopo che tutte le righe di almeno una delle tabelle sono state sottoposte a hash nella tabella hash.
3)La tabella hash è la memoria privata, quindi l'accesso ai dati non comporta molte attività di blocco

Costo dell'hash Join =Costo della lettura della tabella A +costo della lettura della tabella B + qualche piccola elaborazione in memoria

Differenza tra Nested Loop e Hash Join

Partecipa hash Unisciti nidificati
Gli hash join vengono utilizzati quando si uniscono tabelle di grandi dimensioni o quando i join richiedono la maggior parte delle righe di tabelle unite. Viene utilizzato solo per i join di uguaglianza Il join NESTED LOOPS è un'operazione di join che seleziona una riga dall'origine riga iniziale selezionata e utilizza i valori di questa origine riga per accedere o selezionare dall'origine riga unita alla ricerca della riga corrispondente.
-Ideale per transazioni di tipo OLTP
L'operazione hash è normalmente efficiente per i due set di dati quando vengono restituiti molti record. Quando un set di dati ha un numero minimo o nullo di record restituiti e un altro set di dati può essere abbinato utilizzando l'operazione di indicizzazione, il join del ciclo nidificato è più efficiente
Potresti vedere più hash join usati con la modalità di ottimizzazione ALL_ROWS, perché funziona sul modello di visualizzazione dei risultati dopo che tutte le righe di almeno una delle tabelle sono state hash nella tabella hash. Vedrai un maggiore utilizzo del ciclo nidificato quando utilizzi la modalità di ottimizzazione FIRST_ROWS poiché funziona sul modello di visualizzazione dei risultati istantanei all'utente mentre vengono recuperati. Non è necessario selezionare la memorizzazione nella cache dei dati prima che vengano restituiti all'utente. In caso di hash join è necessario ed è spiegato di seguito.