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 & &.
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
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? –
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. –