Quali sono i guadagni/perdite di prestazioni tra join hash e join join, in particolare in Oracle RDBMS?Qual è la differenza tra un join hash e un join unione (Oracle RDBMS)?
risposta
Un join "sort merge" viene eseguito ordinando i due set di dati da unire in base alle chiavi di join e quindi unendoli. L'unione è molto economica, ma l'ordinamento può essere proibitivo, specialmente se l'ordinamento si rovescia sul disco. Il costo dell'ordinamento può essere abbassato se è possibile accedere a uno dei set di dati in ordine ordinato tramite un indice, anche se l'accesso a una percentuale elevata di blocchi di una tabella tramite una scansione dell'indice può anche essere molto costoso rispetto a una scansione completa della tabella .
Un hash join viene eseguito mediante l'hashing di un set di dati in memoria in base alle colonne di join e la lettura dell'altro e il rilevamento della tabella di hash per le corrispondenze. L'hash join è un costo molto basso quando la tabella hash può essere mantenuta interamente in memoria, con un costo totale che ammonta a poco più del costo di leggere i set di dati. Il costo aumenta se la tabella hash deve essere versata su disco in un ordinamento a un passaggio e aumenta considerevolmente per un ordinamento multipass.
Il costo di un hash join può essere ridotto partizionando entrambe le tabelle sulle chiavi di join. Ciò consente all'ottimizzatore di dedurre che le righe da una partizione in una tabella troveranno una corrispondenza solo in una particolare partizione dell'altra tabella e che per le tabelle che hanno n partizioni il join dell'hash viene eseguito come n hash indipendenti. Questo ha i seguenti effetti:
- La dimensione di ciascuna tabella hash è ridotta, riducendo quindi la quantità massima di memoria richiesta e potenzialmente eliminando la necessità che l'operazione richieda spazio su disco temporaneo.
- Per le operazioni di query parallele, la quantità di messaggistica tra processi è notevolmente ridotta, riducendo l'utilizzo della CPU e migliorando le prestazioni, poiché ogni hash join può essere eseguito da una coppia di processi PQ.
- Per le operazioni di query non parallele, il requisito di memoria viene ridotto di un fattore di n e le prime righe vengono proiettate dalla query in precedenza.
Si noti che i join di hash possono essere utilizzati solo per equi-join, ma i join join sono più flessibili.
In generale, se si stanno unendo grandi quantità di dati in un equi-join, allora un hash join sarà una scelta migliore.
Questo argomento è molto ben trattato nella documentazione.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
Voglio solo modificare questo per i posteri che i tag per Oracle non sono stati aggiunti quando ho risposto a questa domanda. La mia risposta era più applicabile a MS SQL.
Unire join è il migliore possibile in quanto sfrutta l'ordine, risultando in un unico passaggio verso il basso per l'unione. Se si hanno due tabelle (o indici di copertura) che hanno il loro ordine lo stesso come una chiave primaria e un indice di una tabella su quella chiave, si otterrebbe un join di unione se si esegue quell'azione.
Hash join è il successivo migliore, dato che di solito viene eseguito quando una tabella ha un numero ridotto (relativamente) di elementi, creando effettivamente una tabella temporanea con hash per ogni riga che viene quindi ricercata continuamente per creare il join.
Il caso peggiore è un ciclo nidificato che è un ordine (n * m) che significa che non c'è ordine o dimensione da sfruttare e il join è semplicemente, per ogni riga nella tabella x, tabella di ricerca y per join da fare.
Se uno fosse sempre migliore dell'altro, allora l'altro non sarebbe mai usato, non credi? Penso che la differenza sia più complessa di questa. –
Mi dispiace se mi hai frainteso. Stavo cercando di descrivere i tipi di join e perché un join di fusione è il migliore. Il problema è che il merge join funziona solo se si dispone di un ordinamento da sfruttare e un hash join è più efficiente quando la tabella unita ha una quantità relativamente piccola di righe. Mi scuso se non è stato chiaro nella risposta. – Spence
I cicli annidati sono i peggiori, naturalmente, quando nient'altro è possibile. – Spence
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i76073 –
http://www.orafaq.com/node/1446 – cagcowboy
http://use-the-index-luke.com/sql/join –