Sono disponibili diversi metodi di unione per ambienti di database con partizioni, inclusi: unioni collocate, unioni di tabelle esterne broadcast, unioni di tabelle esterne dirette, unioni di tabelle interne e tabelle esterne dirette, unioni di tabelle interne broadcast e unioni di tabelle interne dirette.
Nei seguenti diagrammi, q1, q2e q3 fanno riferimento a code di tabelle. Le tabelle a cui si fa riferimento sono divise in due partizioni di database e le frecce indicano la direzione in cui vengono inviate le code di tabella. La partizione del database coordinatore è la partizione del database 0.
Se il metodo join scelto dal compilatore è hash join, i filtri creati in ogni partizione del database remoto possono essere utilizzati per eliminare le tuple prima che vengano inviate alla partizione del database in cui viene elaborato l'hash join, migliorando così le prestazioni.
Unioni collocate
Un'unione collocata si verifica localmente sulla partizione del database su cui risiedono i dati. La partizione del database invia i dati alle altre partizioni del database una volta completata l'unione. Affinché l'ottimizzatore consideri un'unione collocata, le tabelle unite devono essere collocate e tutte le coppie delle chiavi di distribuzione corrispondenti devono partecipare ai predicati join di uguaglianza. La Figura 1 fornisce un esempio.Figura 1. Esempio di unione collocata
Le tabelle LINEITEM e ORDERS sono entrambe partizionate nella colonna ORDERKEY. L'unione viene eseguita localmente in ogni partizione del database. In questo esempio, si presume che il predicato join sia: orders.orderkey
= lineitem.orderkey.
Le tabelle di query materializzate replicate (MQT) aumentano la probabilità di unioni collocate.
Join di tabella esterna broadcast
Le unioni della tabella esterna di trasmissione rappresentano una strategia di unione parallela che può essere utilizzata se non vi sono predicati di unione di uguaglianza tra le tabelle unite. Può essere utilizzato anche in altre situazioni in cui si rivela essere il metodo di unione più efficace in termini di costi. Ad esempio, un'unione della tabella esterna di trasmissione potrebbe verificarsi quando è presente una tabella molto grande e una tabella molto piccola, nessuna delle quali è suddivisa nelle colonne del predicato di unione. Invece di dividere entrambe le tabelle, potrebbe essere più economico trasmettere la tabella più piccola alla tabella più grande. La Figura 2 fornisce un esempio.Figura 2. Esterno broadcast - Esempio di unione tabella
La tabella ORDERS viene inviata a tutte le partizioni del database che hanno la tabella LINEITEM. La coda tabella q2 viene trasmessa a tutte le partizioni del database della tabella interna.
Unioni di tabelle esterne dirette
Nella strategia di unione della tabella esterna diretta, ogni riga della tabella esterna viene inviata a una porzione della tabella interna, in base agli attributi di suddivisione della tabella interna. L'unione si verifica su questa partizione del database. La Figura 3 fornisce un esempio.Figura 3 Esempio di unione tabella esterna diretta
La tabella LINEITEM è partizionata nella colonna ORDERKEY. La tabella ORDERS è partizionata su una colonna differente. La tabella ORDERS viene sottoposta ad hash e inviata alla partizione del database corretta della tabella LINEITEM. In questo esempio, si presume che il predicato join sia: orders.orderkey
= lineitem.orderkey.
Unioni di tabelle interne e tabelle esterne dirette
Nella strategia di unione della tabella interna diretta e della tabella esterna, le righe delle tabelle esterne e interne vengono indirizzate a una serie di partizioni del database, in base ai valori delle colonne di unione. L'unione si verifica su queste partizioni di database. La Figura 4 fornisce un esempio.Figura 4. Esempio di unione di tabella interna e tabella esterna diretta
Nessuna tabella è suddivisa in partizioni nella colonna ORDERKEY. Entrambe le tabelle vengono hash e inviate a nuove partizioni di database, dove vengono unite. Vengono indirizzate sia la coda tabella q2 che q3 . In questo esempio, si presume che il predicato join sia: orders.orderkey = lineitem.orderkey.
Join tabella interna broadcast
Nella strategia di unione della tabella interna di trasmissione, la tabella interna viene trasmessa a tutte le partizioni del database della tabella esterna. La Figura 5 fornisce un esempio.Figura 5. Broadcast interno - Esempio di unione tabella
La tabella LINEITEM viene inviata a tutte le partizioni di database che hanno la tabella ORDERS. La coda tabella q3 viene trasmessa a tutte le partizioni del database della tabella esterna.
Unioni di tabelle interne dirette
Nella strategia di unione della tabella interna diretta, ogni riga della tabella interna viene inviata a una partizione di database della tabella esterna, in base agli attributi di suddivisione della tabella esterna. L'unione si verifica su questa partizione del database. La Figura 6 fornisce un esempio.Figura 6. Interno diretto - Esempio di unione tabella
La tabella ORDERS è partizionata nella colonna ORDERKEY. La tabella LINEITEM è partizionata su una colonna differente. La tabella LINEITEM viene hash e inviata alla partizione del database corretta della tabella ORDERS. In questo esempio, si presume che il predicato join sia: orders.orderkey
= lineitem.orderkey.