2012-03-21 3 views
6

Ho la seguente struttura.C'è qualche danno ad avere un indice duplicato in Postgresql?

CREATE TABLE join_table (
    id integer NOT NULL, 
    col_a integer NOT NULL, 
    col_b integer NOT NULL 
) 

CREATE INDEX index_on_col_a ON join_table USING btree (col_a); 
CREATE INDEX index_on_col_b ON join_table USING btree (col_b); 
CREATE UNIQUE INDEX index_on_col_a_and_col_b ON join_table USING btree (col_a, col_b); 

Ci sono anche chiavi esterne su col_a e col_b.

Ovviamente non è più necessario, ma c'è un costo o un vantaggio per mantenerlo o eliminarlo?

La mia ipotesi è;

  • mantenendolo rallenterà inserti
  • seleziona utilizzando solo col_a può essere più veloce se lo tengo
+0

Sembra che tu conosca già la risposta? – Andomar

+0

hmm ... dovrei evitare di indovinare nelle domande? forse qualcuno ha qualcosa di più fermo di un'ipotesi. –

+1

Dipende dal caso, Prestazioni di scrittura migliori o query perfor Ma dalle mie opinioni personali, abbiamo bisogno di drop index index_on_col_a – francs

risposta

6

è possibile rilasciare l'indice su col_a. PostgreSQL è in grado di utilizzare l'indice combinato se si esegue una query su col_a ed è anche possibile utilizzare l'indice se si esegue una query su col_a e col_b. Questi tipi di query possono utilizzare l'indice combinato:

WHERE col_a = 'val' 
WHERE col_a = 'val' AND col_b = 'val' 

L'indice combinato non può essere utilizzato per interrogare solo col_b o un OR giunzione di col_a e col_b. Pertanto, l'indice aggiuntivo su col_b può avere senso se si hanno spesso query che richiedono solo col_b.

Modifica: Quindi: non si ha un vantaggio nella creazione di index_on_col_a, ma si ha una velocità di scrittura più lenta. Lasciatelo cadere