2014-10-13 18 views
8

Trong postgresql, tôi thêm một chỉ mục vào một bảng lớn, và mất khoảng 1 giây (trong đó, thẳng thắn, làm tôi ngạc nhiên).Tại sao việc giảm chỉ mục mất nhiều thời gian hơn việc tạo chỉ mục?

Khi tôi đi đến thả chỉ mục, tôi để cho nó chạy trong> 200 giây mà không quay trở lại và cuối cùng đã hủy hoạt động thả.

CREATE INDEX idx_cservicelocationdivisionstatus_inversed 
ON cservicelocationdivisionstatus (cservicelocationdivisionid, startdate, enddate DESC); 

Mất rất ít thời gian, nhưng

DROP INDEX idx_cservicelocationdivisionstatus_inversed; 

Đã quá lâu mà tôi đã từ bỏ và hủy bỏ.

Bảng cservicelocationdivisionstatus có 6 cột và khoảng 310 nghìn hàng dữ liệu.

Tại sao việc xóa chỉ mục mất nhiều thời gian hơn việc tạo chỉ mục?

EDIT: This page cho biết rằng đối với mySql, một bảng có nhiều chỉ mục sẽ sao chép bảng và chèn lại tất cả các hàng mà không có chỉ mục bạn đang thả. (Tồi tệ hơn, với mySql, nếu bạn thả nhiều chỉ mục trên cùng một bảng, nó sẽ sao chép lại bảng một lần cho mỗi chỉ mục bạn đang xóa, thay vì thông minh và sao chép lại dữ liệu một lần mà không có tất cả các chỉ mục bạn rơi xuống.) Có phải điều gì đó như thế này xảy ra với postgres không?

+0

Kiểm tra khóa trên chỉ mục/bảng: http://www.postgresql.org/docs/current/static/monitoring-locks.html Bạn không thể thả chỉ mục nếu nó được truy vấn sử dụng. –

Trả lời

15

Chỉ mục trên bảng có kích thước bạn đã đề cập thường có thể bị xóa khá nhanh (và chắc chắn nhanh hơn 3 phút trở lên). Nghe có vẻ như tôi đã sử dụng bảng/chỉ mục và do đó không thể bị loại bỏ.

Bạn có thể xác nhận điều đó bằng cách truy vấn bảng pg_stat_activity và tìm kiếm hoạt động liên quan đến bảng mà bạn đã tạo chỉ mục.

+0

Đây là vấn đề. Đã có một truy vấn chạy dài (> 20 phút) đang sử dụng bảng. Ngay sau khi tôi giết truy vấn, mất 51 ms để thả chỉ mục. –

+0

Ah. 51ms âm thanh giống như nó. =) – khampson

+2

DROP INDEX CONCURRENTLY có thể là một bản sửa lỗi nhanh khác cho vấn đề này. – kert

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