小编典典

PostgreSQL 可以索引数组列吗?

all

我在文档中找不到这个问题的明确答案。如果列是数组类型,所有输入的值都会单独索引吗?

我创建了一个包含一int[]列的简单表,并在其上放置了唯一索引。我注意到我无法添加相同的整数数组,这让我相信索引是数组项的组合,而不是每个项的索引。

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

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

索引是否有助于此查询?


阅读 81

收藏
2022-07-13

共1个答案

小编典典

是的,您可以索引一个数组,但您必须使用数组运算符GIN-index
类型

例子:

    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 选项的情况下它可以与 && 和 @> 运算符一起使用

2022-07-13