2013-08-15 16 views
7

Chúng tôi có một bảng với một cột mảng lập chỉ mục:Có thể mảng chồng chéo Postgres (&&) sử dụng một chỉ mục không?

CREATE TABLE mention (
    id SERIAL, 
    phraseIds integer[], 
    PRIMARY KEY (id) 
); 
CREATE INDEX indx_mentions_phraseIds on mention USING GIN (phraseids public.gin__int_ops); 

Queries sử dụng "chồng chéo" nhà điều hành trên cột này dường như không sử dụng các chỉ số:

explain analyze select m.id FROM mention m WHERE m.phraseIds && ARRAY[11638,11639]; 

Seq Scan on mention m (cost=0.00..933723.44 rows=1404 width=4) (actual time=103.018..3751.525 rows=1101 loops=1) 
Filter: (phraseids && '{11638,11639}'::integer[]) 
Rows Removed by Filter: 7019974 
Total runtime: 3751.618 ms 

Có thể để có được Postgresql sử dụng chỉ mục? Hay chúng ta nên làm gì khác?

Cập nhật: Tôi lặp lại thử nghiệm với 'SET enable_seqscan TO off' và chỉ mục vẫn không được sử dụng.

Cập nhật: Tôi nên đề cập rằng tôi đang sử dụng 9.2 với phần mở rộng intarray.

Cập nhật: Dường như phần mở rộng intarray là một phần của vấn đề này. Tôi đã tạo lại bảng mà không sử dụng phần mở rộng intarray và chỉ mục được sử dụng như mong đợi. Bất cứ ai biết làm thế nào để có được chỉ mục được sử dụng với phần mở rộng intarray? Tài liệu (http://www.postgresql.org/docs/9.2/static/intarray.html) nói rằng các chỉ mục được hỗ trợ cho & &.

+1

Sử dụng 'SET enable_seqscan TO off' và xem đầu tiên nếu PG * có thể * sử dụng chỉ mục, cần và sau đó quét chỉ mục sẽ nhanh hơn quét seq. Đăng kết quả ở đây, xin vui lòng. – MatheusOl

+0

Tại sao lưu trữ * mảng * số id trong mỗi hàng thiết kế tốt nhất cho bảng của bạn? –

+0

Dữ liệu trước đây trong MySQL và chúng tôi đã sử dụng một số cột riêng biệt (cụm từ0, cụm từ1, ...) để giữ dữ liệu. Sử dụng một bảng riêng biệt là rất chậm trên MySQL (nhiều triệu hàng trong cả hai bảng và chúng ta cần phải sắp xếp kết quả và làm giới hạn). Sử dụng một mảng Postgres có vẻ như là một điều tốt để làm. –

Trả lời

3

Tôi đã xây dựng một bảng tương tự trong PostgreSQL 9.2; sự khác biệt là USING GIN (phraseids); Tôi dường như không có int_ops có sẵn trong bối cảnh này vì một lý do nào đó. Tôi đã tải một vài nghìn hàng dữ liệu ngẫu nhiên (ish).

Tắt enable_seqscan để cho phép PostgreSQL sử dụng chỉ mục.

PostgreSQL tính chi phí quét tuần tự nhỏ hơn chi phí của quá trình quét bitmap heap. Thời gian thực tế của quét tuần tự là 10% thời gian thực tế của quá trình quét bitmap heap, nhưng tổng thời gian chạy cho quét tuần tự là nhiều hơn một chút so với tổng thời gian chạy của quá trình quét bitmap heap.

+0

Ok. Không sử dụng phần mở rộng intarray trên chỉ mục cho cột này sắp xếp nó ra. Đó là những gì chúng ta sẽ làm ngay bây giờ. Tx. –