2012-11-02 12 views
10

Il vincolo UNIQUE specificato su una colonna o un gruppo di colonne influisce in alcun modo sulle prestazioni di scrittura di Postgres DB? Come funziona internamente?In che modo un vincolo univoco influisce sulle prestazioni di scrittura in Postgres DB

Intendo, esegue un controllo univoco al momento dell'inserimento di un nuovo record? Se sì, come si fa, fa una ricerca lineare per un valore duplicato già esistente nel DB? In tal caso, si ritiene che influenzi le prestazioni, ovvero più il numero di vincoli univoci peggiori sarebbe la prestazione di scrittura/inserimento? È vero?

risposta

20

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.

+0

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 –