如何使用array_to_string索引Postgresql中的varchar数组?

时间:2015-10-05 15:02:05

标签: postgresql indexing

我想在postgresql 9.3中的varchar数组列中设置索引。有人告诉我使用array_to_string(col)设置它,但我真的不明白它是如何工作的。我想出了以下声明:

CREATE INDEX CONCURRENTLY rtb_id_search ON sites USING GIN(array_to_string(rtb_id, ''));

然而,postgresql抱怨:

 ERROR:  functions in index expression must be marked IMMUTABLE

2 个答案:

答案 0 :(得分:2)

你会加速哪些操作? GIN indes直接支持数组:

create table foo(a text[]);
create index on foo using gin (a);
set enable_seqscan to off;

可能存在一些问题,因为索引并不支持所有数组运算符。但几乎就是这样。

 postgres=# explain select * from foo where a @> ARRAY['a'];
┌────────────────────────────────────────────────────────────────────────┐
│                               QUERY PLAN                               │
╞════════════════════════════════════════════════════════════════════════╡
│ Bitmap Heap Scan on foo  (cost=8.05..18.20 rows=7 width=32)            │
│   Recheck Cond: (a @> '{a}'::text[])                                   │
│   ->  Bitmap Index Scan on foo_a_idx  (cost=0.00..8.05 rows=7 width=0) │
│         Index Cond: (a @> '{a}'::text[])                               │
└────────────────────────────────────────────────────────────────────────┘
(4 rows)

答案 1 :(得分:0)

create function string_array_to_string(text[], text, text) returns text as $$
   select array_to_string($1, $2, $3)
$$ language sql cost 1 immutable;

create index concurrently sites_rtb_ids on sites using gin (string_array_to_string(rtb_ids, ' ', ' ') gin_trgm_ops);

这是创建索引的方法。使用的函数需要标记为不可变。