Postgres使用通常的数组索引而不是intarray索引

我有列的agg_series_id类型为integer[]intarray在其上创建了intarray索引。 查询创建索引是:

CREATE INDEX idx_agg_series_id ON some_tbl USING gin (agg_series_id gin__int_ops);

桌子上有大约500k排。 我有这样的查询执行计划SELECT count(*) FROM some_tbl WHERE agg_series_id <@ ARRAY [1]

Aggregate  (cost=129835.91..129835.92 rows=1 width=8)
 ->  Seq Scan on some_tbl  (cost=0.00..129835.89 rows=11 width=0)
       Filter: (agg_series_id @> '{1}'::integer[])

从计划中可以看出,没有使用intarray索引。 关停seqscan通过设定set enable_seqscan=off; 没有改变计划。 我试图增加列的统计信息并尝试执行VACUUM ANALYZE

但是,如果我从索引中删除intarray扩展( gin__int_ops ),然后创建一个新的索引:

CREATE INDEX idx_agg_series_id2 ON some_tbl USING gin (agg_series_id);

在这种情况下,新的索引用于执行计划中:

Aggregate  (cost=55.93..55.94 rows=1 width=8)
 ->  Bitmap Heap Scan on some_tbl  (cost=12.08..55.91 rows=11 width=0)
       Recheck Cond: (agg_series_id @> '{1}'::integer[])
       ->  Bitmap Index Scan on idx_agg_series_id2  (cost=0.00..12.08 rows=11 width=0)
             Index Cond: (agg_series_id @> '{1}'::integer[])

所以问题是:为什么在integer[]列的执行计划中不使用intarray索引,而是使用通常的数组索引? 或者,也许我可以调整一些设置或类型,以便可以使用intarray索引?

PostgreSQL 9.6.2在x86_64-pc-linux-gnu上,由gcc编译(Debian 4.9.2-10)4.9.2,64位


你是否指定了一些特定模式的gin__int_ops选项? 因为它看起来像将intarray扩展安装到另一个模式中。 你会发现intarray扩展的<@操作符(和&&@> )与相同名称的内置操作符相同,所以如果没有安装intarray扩展, <@操作符将被用作操作符的规则数组。 在这个回合中,常规的GIN索引将被使用。

你可以检查你的方案中是否安装了intarray扩展。 尝试在某些查询中使用icount函数。 如果您收到“找不到”消息的错误,那么您在当前模式中没有intarray扩展名。 如果是这样,您可以使用SET search_path TO some_another_schema命令更改当前模式。

如果一个不同的操作符被用于intarray操作而不是内置操作符,那么可能会减少混淆。

链接地址: http://www.djcxy.com/p/87233.html

上一篇: Postgres uses usual array index instead of intarray index

下一篇: PostgreSQL LIKE query performance variations