La creazione di un vincolo UNIQUE
o un PRIMARY KEY
risultati nella creazione di un indice btree UNIQUE
. Questo indice deve essere aggiornato ogni volta che un record è INSERT
ed, UPDATE
ed, o DELETE
d se qualsiasi colonna indicizzata viene modificata. Se non vengono modificate colonne indicizzate, è possibile eseguire l'HOT (ottimizzazione tuple solo heap) per evitare l'aggiornamento dell'indice, soprattutto se si dispone di un valore non predefinito FILLFACTOR
per creare spazio nelle pagine.
L'aggiornamento dell'indice su inserimento/aggiornamento richiede tempo, pertanto l'inserimento in una tabella indicizzata UNIQUE
è più lento rispetto all'inserimento in uno senza alcun indice univoco o chiave primaria. Lo stesso vale per lo UPDATE
, ma se l'indice viene utilizzato per trovare la tupla da aggiornare (ed evitare un seqscan) di solito è una vincita netta contro non avere affatto l'indice. Se un indice diverso viene utilizzato per trovare la tupla, o se un seqscan è più veloce (come è vero per le tabelle piccole) allora proprio come un INSERT
l'indice non ha alcun vantaggio e comporta solo un costo di scrittura per aggiornarlo per quell'operazione. Questo vale per tutti gli indici, non solo per gli indici UNIQUE
.
Ogni INSERT
o UPDATE
su una colonna indicizzata UNIQUE
richiede una ricerca dell'indice per verificare che la chiave non sia in conflitto con una chiave esistente. Dalla vaga memoria questo è combinato con il processo di inserimento della nuova voce nell'indice, ma non ne sono sicuro al 100%.
AFAIK DELETE
non ha alcun effetto sull'indice. Imposta semplicemente il xmax
per la tupla nell'heap.
L'indice viene aggiornato anche se si annulla la transazione o la transazione con un errore dopo l'inserimento o l'aggiornamento nella colonna vincolata UNIQUE
. VACUUM
funziona da autovacuum pulisce le voci di indice morto in seguito. Vedi Concurrency Control in the PostgreSQL manual.
Tutto ciò vale anche per un PRIMARY KEY
, che viene anche implementato utilizzando un indice UNIQUE
.
Ogni indice, inclusi gli indici utilizzati dai vincoli PRIMARY KEY
e UNIQUE
, comporta una penalità in termini di prestazioni di scrittura.
fonte
2012-11-02 07:12:54
Grazie per la risposta. Questo è stato spiegato molto bene. La chiave primaria influisce anche sull'ordinamento dei record? Sarà fantastico se puoi fornire una risposta alla mia altra domanda a: http://stackoverflow.com/questions/13190720/what-is-the-order-of-records-when-the-primary-key-is- specificato-su-un-gruppo-di-col –