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