これは、「intarray をインストールした場合に発生します。 "拡張機能。テストしてみましょう:
drop extension intarray;
explain analyze
select * from test_intarray where codes @> array[123];
-- Uses "Bitmap Index Scan on test_intarray_idx"
「intarray」拡張機能は、@>
などの整数配列に独自の演算子を提供します。 、インデックスは一般的な配列演算子で機能するように設計されています。これは、スキーマ修飾演算子を使用して示すことができます:
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"
詳細については、このディスカッションを参照してください: intarrayモジュールからの&&演算子のオーバーロードにより、インデックスの使用が妨げられます。
それでも「intarray」拡張機能を利用したい場合は、インデックスを作成するときに独自の演算子クラス「gin__int_ops」を指定できます(デフォルトの「array_ops」の代わりに):
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"