【发布时间】:2013-11-09 14:56:44
【问题描述】:
我可以在 Postgresq 9.1 中索引数组列以支持:
select * from t where 100 < any(a) and 100 > any(a)
其中a 是一个整数数组(其中的行具有一些值,例如{90,110},因此查询不会返回空。)
详情
create table t ( a integer[] )
insert into t values ('{90,110}'::integer[])
在上述查询上运行 explain analyze 会产生:
Seq Scan on t (cost=0.00..1.07 rows=2 width=32) (actual time=0.009..0.009 rows=1 loops=1)
Filter: ((100 < ANY (a)) AND (100 > ANY (a)))
Total runtime: 0.023 ms
背景
以下问题描述了一种方法,但似乎不适用于非固定长度数组:
Can PostgreSQL index array columns?
Postgres docs 描述了内置的 GIN 运算符,但它们似乎不支持大于/小于运算:
例如,PostgreSQL 的标准发行版包括 GIN 一维数组的运算符类,支持索引 使用这些运算符的查询:、=、&&
【问题讨论】:
-
EXPLAIN ANALYZE和架构定义,以及 PostgreSQL 版本。 -
问题不清楚。
select 100 < '{90,110}'::int[];产生错误。也许您实际上正在寻找范围类型?select 100 <@ '[90,110]'::int4range; -
@CraigRinger 已更新,谢谢。
-
@Denis 更新了问题,谢谢。一般来说,可以在本专栏中找到任意大小的整数列表——不仅仅是边界。并且可以查询任意数量的相等和/或更大/更少的比较。
-
所以......您正在尝试为“此数组中的任何元素大于值'a'任何元素(可能是不同的元素)小于值' b'" ?
标签: postgresql indexing