2013-09-02 44 views
27

Việc tạo chỉ mục có hiệu quả hơn sau khi tải dữ liệu đã hoàn thành hoặc trước hoặc không quan trọng?Cách hiệu quả nhất để tạo chỉ mục trong Postgres

Ví dụ: giả sử tôi có 500 tệp để tải vào DB Postgres 8.4. Dưới đây là hai kịch bản tạo chỉ mục mà tôi có thể sử dụng:

  1. Tạo chỉ mục khi bảng được tạo, sau đó tải từng tệp vào bảng; hoặc
  2. Tạo chỉ mục sau khi tất cả các tệp đã được tải vào bảng.

Bản thân dữ liệu bảng khoảng 45 Gigabyte. Chỉ số này khoảng 12 Gigabyte. Tôi đang sử dụng một chỉ số tiêu chuẩn. Nó được tạo ra như thế này:

CREATE INDEX idx_name ON table_name (column_name); 

Tải dữ liệu của tôi sử dụng COPY FROM.

Sau khi tất cả các tệp được tải, không có cập nhật, xóa hoặc tải bổ sung nào sẽ xảy ra trên bảng (đó là giá trị dữ liệu của một ngày sẽ không thay đổi). Vì vậy, tôi muốn hỏi kịch bản nào sẽ hiệu quả nhất? Thử nghiệm ban đầu dường như chỉ ra rằng tải tất cả các tập tin và sau đó tạo chỉ mục (kịch bản 2) là nhanh hơn, nhưng tôi đã không thực hiện một so sánh khoa học của hai phương pháp tiếp cận.

Trả lời

43

Quan sát của bạn là chính xác - hiệu quả hơn để tải dữ liệu trước tiên và chỉ sau đó tạo chỉ mục. Lý do cho việc này là cập nhật chỉ mục trong quá trình chèn là tốn kém. Nếu bạn tạo chỉ mục sau khi tất cả dữ liệu ở đó, nó sẽ nhanh hơn nhiều. Nếu bạn cần nhập một lượng lớn dữ liệu vào bảng đã được lập chỉ mục hiện tại, trước tiên bạn nên xóa chỉ mục hiện tại trước tiên, nhập dữ liệu và sau đó tạo lại chỉ mục.

Một nhược điểm của việc tạo chỉ mục sau khi nhập là bảng phải được khóa và có thể mất nhiều thời gian (nó sẽ không bị khóa trong kịch bản ngược lại). Nhưng, trong PostgreSQL 8.2 trở lên, bạn có thể sử dụng CREATE INDEX CONCURRENTLY, không khóa bảng trong khi lập chỉ mục (với một số lưu ý).

+0

Vâng, khi bảng bị khóa, không ai có thể đọc hoặc viết, điều này có thể rất khó chịu, ngay cả vào ban đêm. Bạn nên sử dụng CREATE INDEX CONCURRENTLY – mvp

+0

@BradTilley: Tôi nghĩ đó là tính năng mới, nhưng PostgreSQL 8.4 [hỗ trợ nó] (http://www.postgresql.org/docs/8.4/static/sql-createindex.html). – mvp

+4

"* khi bảng bị khóa không ai có thể đọc hoặc viết *" - Tôi không nghĩ đó là sự thật. Khi 'CREATE INDEX' đang chạy, bảng vẫn có thể được đọc, nhưng không được cập nhật nếu tôi không nhầm. –

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