在PostgreSQL中创建包含标量和数组列的多列索引

时间:2015-08-11 15:12:34

标签: arrays postgresql indexing

为了优化复杂的PostgreSQL查询,我尝试创建一个包含标量字符串和数组以及支持数组操作的索引(@><@&&)。

但到目前为止我只设法创建了一个BTREE索引:

CREATE INDEX idx1
  ON "MyTable"
  USING btree
  ("Char_1", "Array_1", "Array_2", "Array_3", "Char_2");

不支持数组操作(@><@&&)。

我尝试使用GINGiST(使用btree_ginbtree_gist扩展名),但我发现无法使用标量列和数组列相同的指数。

看起来GIN不支持标量:

ERROR:  data type character has no default operator class for access method "gin"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

虽然GiST不支持数组:

ERROR:  data type character varying[] has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

我发现创建这样一个索引的唯一方法是使用to_tsvector函数将所有标量字符串转换为tsvector数据类型。但我不需要全文搜索。我甚至尝试创建自己的操作符类,但很快意识到它超出了我的范围。

有没有办法创建包含标量字符串和数组的多列GIN / GiST索引?

1 个答案:

答案 0 :(得分:4)

您需要分别安装附加模块btree_ginbtree_gist,这些模块提供缺少的操作符类。

每个数据库运行

CREATE EXTENSION btree_gin;  -- or btree_gist

然后你应该能够创建多列索引:

CREATE INDEX idx1 ON "MyTable" USING gin
  ("Varchar_1", "Array_1", "Array_2", "Array_3", "Varchar_2");

详细说明:

对于数组类型的索引: GIN 是完美的索引类型。 The documentation:

  

GIN索引是反向索引,可以处理包含的值   多个键,例如数组

大胆强调我的。 为各种数据类型定义了运算符@><@&&。其中一些也与GiST索引合作。但是使用数组作为操作数,总是 GIN索引AFAIC。

我今天在dba.SE上写了一个相关的答案,查询列出了相关的运算符:

数据类型character很可能不是您想要的: