Teradata - Indice primario partizionato
L'indice primario partizionato (PPI) è un meccanismo di indicizzazione utile per migliorare le prestazioni di determinate query. Quando le righe vengono inserite in una tabella, vengono archiviate in un AMP e disposte in base all'ordine hash delle righe. Quando una tabella viene definita con PPI, le righe vengono ordinate in base al numero di partizione. All'interno di ogni partizione, sono organizzati in base al loro hash di riga. Le righe vengono assegnate a una partizione in base all'espressione di partizione definita.
Vantaggi
Evita la scansione completa della tabella per determinate query.
Evita di utilizzare un indice secondario che richiede una struttura fisica aggiuntiva e una manutenzione I / O aggiuntiva.
Accedi rapidamente a un sottoinsieme di una tabella di grandi dimensioni.
Elimina rapidamente i vecchi dati e aggiungi nuovi dati.
Esempio
Considera la seguente tabella degli ordini con l'indice primario su OrderNo.
StoreNo | Numero d'ordine | Data dell'ordine | Ordine totale |
---|---|---|---|
101 | 7501 | 2015-10-01 | 900 |
101 | 7502 | 2015-10-02 | 1.200 |
102 | 7503 | 2015-10-02 | 3.000 |
102 | 7504 | 2015-10-03 | 2.454 |
101 | 7505 | 2015-10-03 | 1201 |
103 | 7506 | 2015-10-04 | 2.454 |
101 | 7507 | 2015-10-05 | 1201 |
101 | 7508 | 2015-10-05 | 1201 |
Supponi che i record siano distribuiti tra AMP come mostrato nelle tabelle seguenti. Le registrazioni vengono archiviate in AMP, ordinate in base all'hash della riga.
RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
3 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
3 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
Se esegui una query per estrarre gli ordini per una data particolare, l'ottimizzatore può scegliere di utilizzare la scansione completa della tabella, quindi è possibile accedere a tutti i record all'interno dell'AMP. Per evitare ciò, è possibile definire la data dell'ordine come Indice primario partizionato. Quando le righe vengono inserite nella tabella degli ordini, vengono partizionate in base alla data dell'ordine. All'interno di ogni partizione verranno ordinati in base all'hash della riga.
I dati seguenti mostrano come verranno archiviati i record negli AMP, se sono partizionati in base alla data dell'ordine. Se viene eseguita una query per accedere ai record in base alla data dell'ordine, sarà possibile accedere solo alla partizione che contiene i record per quel particolare ordine.
Partizione | RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|---|
0 | 3 | 7501 | 2015-10-01 |
1 | 1 | 7505 | 2015-10-03 |
1 | 2 | 7504 | 2015-10-03 |
2 | 4 | 7508 | 2015-10-05 |
Partizione | RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|---|
0 | 2 | 7502 | 2015-10-02 |
0 | 4 | 7503 | 2015-10-02 |
1 | 3 | 7506 | 2015-10-04 |
2 | 1 | 7507 | 2015-10-05 |
Di seguito è riportato un esempio per creare una tabella con l'indice primario della partizione. La clausola PARTITION BY viene utilizzata per definire la partizione.
CREATE SET TABLE Orders (
StoreNo SMALLINT,
OrderNo INTEGER,
OrderDate DATE FORMAT 'YYYY-MM-DD',
OrderTotal INTEGER
)
PRIMARY INDEX(OrderNo)
PARTITION BY RANGE_N (
OrderDate BETWEEN DATE '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY
);
Nell'esempio precedente, la tabella è partizionata in base alla colonna OrderDate. Ci sarà una partizione separata per ogni giorno.