2012-03-21 38 views
6

Tôi có cấu trúc sau.Có bất kỳ tác hại nào để có chỉ mục trùng lặp trong Postgresql không?

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); 

Ngoài ra còn có khóa ngoài trên col_a và col_b.

Rõ ràng index_on_col_a không còn cần thiết, nhưng có chi phí hoặc lợi ích để giữ hoặc xóa không?

Tôi đoán là;

  • giữ nó sẽ làm chậm chèn
  • Lựa chọn sử dụng chỉ col_a có thể nhanh hơn nếu tôi giữ nó
+0

Có vẻ như bạn đã biết câu trả lời? – Andomar

+0

hmm ... tôi có nên tránh đoán câu hỏi không? có thể ai đó có thứ gì đó chắc chắn hơn là đoán. –

+1

Nó phụ thuộc vào trường hợp, hiệu suất viết tốt hơn hoặc truy vấn perfor Nhưng từ ý kiến ​​cá nhân của tôi, chúng tôi cần chỉ số thả index_on_col_a – francs

Trả lời

6

Bạn có thể thả các chỉ mục trên col_a. PostgreSQL có thể sử dụng chỉ mục kết hợp nếu bạn truy vấn trên col_a và cũng có thể sử dụng chỉ mục nếu bạn truy vấn trên col_acol_b. Những loại truy vấn có thể sử dụng các chỉ số kết hợp:

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

Chỉ số kết hợp không thể được sử dụng để truy vấn chỉ col_b hoặc một OR ngã ba col_acol_b. Vì vậy, chỉ mục bổ sung trên col_b có thể có ý nghĩa nếu bạn thường xuyên có truy vấn chỉ truy vấn col_b.

Chỉnh sửa: Vì vậy: bạn không có lợi thế khi tạo index_on_col_a, nhưng bạn có tốc độ ghi chậm hơn. Thả nó.

Các vấn đề liên quan