为了优化复杂的PostgreSQL查询,我尝试创建一个包含标量字符串和数组以及支持数组操作的索引(@>
,<@
和&&
)。
但到目前为止我只设法创建了一个BTREE
索引:
CREATE INDEX idx1
ON "MyTable"
USING btree
("Char_1", "Array_1", "Array_2", "Array_3", "Char_2");
不支持数组操作(@>
,<@
和&&
)。
我尝试使用GIN
和GiST
(使用btree_gin
和btree_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
索引?
答案 0 :(得分:4)
您需要分别安装附加模块btree_gin
或btree_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
很可能不是您想要的: