1. ホーム
  2. arrays

[解決済み] PostgreSQLは配列のカラムにインデックスを付けることができますか?

2022-04-15 18:58:07

質問

この質問に対する明確な答えがドキュメントに見当たらないのですが。カラムが配列型の場合、入力された値はすべて個別にインデックス化されるのでしょうか?

簡単なテーブルを作成し、1つの int[] 列を作成し、それにユニークなインデックスを付けました。同じintsの配列を追加できないことに気づきました。これは、インデックスが各項目のインデックスではなく、配列項目の合成であることを示唆しています。

INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');

SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");

インデックスはこのクエリに役立っていますか?

解決方法は?

はい、配列のインデックスを作成することはできますが、そのためには 配列演算子 GINインデックス型 .

    CREATE TABLE "Test"("Column1" int[]);
    INSERT INTO "Test" VALUES ('{10, 15, 20}');
    INSERT INTO "Test" VALUES ('{10, 20, 30}');

    CREATE INDEX idx_test on "Test" USING GIN ("Column1");

    -- To enforce index usage because we have only 2 records for this test... 
    SET enable_seqscan TO off;

    EXPLAIN ANALYZE
    SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20];

結果

Bitmap Heap Scan on "Test"  (cost=4.26..8.27 rows=1 width=32) (actual time=0.014..0.015 rows=2 loops=1)
  Recheck Cond: ("Column1" @> '{20}'::integer[])
  ->  Bitmap Index Scan on idx_test  (cost=0.00..4.26 rows=1 width=0) (actual time=0.009..0.009 rows=2 loops=1)
        Index Cond: ("Column1" @> '{20}'::integer[])
Total runtime: 0.062 ms

備考

というのは、多くの場合 gin__int_ops オプションが必要です。

create index <index_name> on <table_name> using GIN (<column> gin__int_ops)

gin__int_opsオプションなしで&&と@>演算子で動作するケースはまだ見たことがないのですが