首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用gin索引查询postgres数组?

如何使用gin索引查询postgres数组?
EN

Stack Overflow用户
提问于 2014-03-01 05:27:51
回答 1查看 6.8K关注 0票数 20

我有一个postgres数组列和一个gin索引:

CREATE TABLE things (
    id integer NOT NULL,
    tags character varying(255)[]
);

CREATE INDEX index_things_on_tags ON things USING gin (tags);

有几种方法可以使用各种数组运算符检查列中是否存在元素。以下是我所见过的:

  1. select * from things where 'blue' = ANY (tags)
  2. select * from things where tags <@ '{"blue"}'
  3. select * from things where '{"blue","yellow"}' && tags;

在postgres 9.3中:

第一个会使用杜松子酒索引吗?

  • ,我很确定第二个会使用索引。然而,它与第一个不同。它不允许我检查蓝色是否是其中一个标记,它要求我指定确切的数组。有没有办法让2中的语法风格达到1的效果,第三个是achieving?

  • In,我想要任何一行都是蓝色或黄色的。这个查询会使用gin索引吗?否则,如何使用索引执行此查询?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-01 06:13:29

为什么不测试一下呢?

regress=> SET enable_seqscan  = off;
SET

regress=> explain select * from things where 'blue' = ANY (tags);
                                QUERY PLAN                                 
---------------------------------------------------------------------------
 Seq Scan on things  (cost=10000000000.00..10000000037.67 rows=6 width=36)
   Filter: ('blue'::text = ANY ((tags)::text[]))
(2 rows)

regress=> explain select * from things where tags <@ '{"blue"}';
                                     QUERY PLAN                                     
------------------------------------------------------------------------------------
 Bitmap Heap Scan on things  (cost=12.05..21.52 rows=6 width=36)
   Recheck Cond: (tags <@ '{blue}'::character varying[])
   ->  Bitmap Index Scan on index_things_on_tags  (cost=0.00..12.05 rows=6 width=0)
         Index Cond: (tags <@ '{blue}'::character varying[])
(4 rows)

regress=> explain select * from things where '{"blue","yellow"}' && tags;
                                     QUERY PLAN                                      
-------------------------------------------------------------------------------------
 Bitmap Heap Scan on things  (cost=12.10..22.78 rows=12 width=36)
   Recheck Cond: ('{blue,yellow}'::character varying[] && tags)
   ->  Bitmap Index Scan on index_things_on_tags  (cost=0.00..12.09 rows=12 width=0)
         Index Cond: ('{blue,yellow}'::character varying[] && tags)
(4 rows)

因此,Pg将索引用于&&<@查询,而不是= ANY (...)

我确信教Pg将x = ANY (y)转换成ARRAY[x] @> y是可能的,但目前还不能。

2所做的就是你所说的你想要的。测试“蓝色”是否是其中一个标签。这不是一个平等测试,这是一个成员资格测试。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22106169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档