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

Leo*_*tny 5 arrays postgresql indexing

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

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

CREATE INDEX idx1
  ON "MyTable"
  USING btree
  ("Char_1", "Array_1", "Array_2", "Array_3", "Char_2");
Run Code Online (Sandbox Code Playgroud)

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

我尝试使用GINand GiST(使用btree_ginandbtree_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.
Run Code Online (Sandbox Code Playgroud)

whileGiST不支持数组:

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.
Run Code Online (Sandbox Code Playgroud)

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

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

Erw*_*ter 5

您需要安装附加模块btree_ginbtree_gist分别提供缺少的运算符类。

每个数据库运行一次

CREATE EXTENSION btree_gin;  -- or btree_gist
Run Code Online (Sandbox Code Playgroud)

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

CREATE INDEX idx1 ON "MyTable" USING gin
  ("Varchar_1", "Array_1", "Array_2", "Array_3", "Varchar_2");
Run Code Online (Sandbox Code Playgroud)

细节:

至于数组类型的索引:GIN是完美的索引类型。文档:

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

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

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

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