Điều này xảy ra nếu bạn đã cài đặt " intarray "phần mở rộng. Hãy kiểm tra nó:
drop extension intarray;
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"
Phần mở rộng "intarray" cung cấp các toán tử riêng cho mảng số nguyên, chẳng hạn như @>
, trong khi chỉ mục được thiết kế để hoạt động với các toán tử mảng chung. Điều này có thể được chứng minh bằng cách sử dụng các toán tử đủ điều kiện của lược đồ:
create extension intarray;
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Seq Scan on test_intarray"
explain analyze
select * from test_intarray where codes operator([email protected]>) array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"
Xem cuộc thảo luận này để biết thêm chi tiết: Toán tử &&bị quá tải từ mô-đun intarray ngăn cản việc sử dụng chỉ mục.
Nếu bạn vẫn muốn tận dụng tiện ích mở rộng "intarray", bạn có thể chỉ định lớp toán tử riêng của nó "gin__int_ops" khi tạo chỉ mục (thay vì "array_ops" mặc định):
create index test_intarray_idx2 on test_intarray using GIN (codes gin__int_ops);
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx2"