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索引?
您需要安装附加模块btree_gin或btree_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很可能不是您想要的:
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |