Mic*_*son 3 postgresql indexing uuid postgresql-9.6
我正在尝试在 Postgres 9.6 数据库中添加一个包含 UUID 的 GIN 索引。从技术上讲,它是一个复合索引,复合 GIN 支持来自 btree_gin 插件。
我尝试用以下语句创建索引:
CREATE EXTENSION btree_gin;
CREATE INDEX ix_tsv ON text_information USING GIN (client_id, text_search_vector);
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: data type uuid 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.
client_id是数据类型uuid并且text_search_vector是tsvector. 我认为复合/btree_gin 因素实际上并不相关,因为我尝试单独创建索引时遇到相同的错误client_id,但希望如果有解决方案,它也可以与复合索引一起使用。
我在 uuid 数组上找到了 PostgreSQL GIN 索引,这似乎表明它应该是可能的(如果可以完成 UUID 数组,那么肯定可以完成单个 UUID )。然而,该解决方案对我来说相当不透明 - 如何修改该解决方案以支持单个 UUID 并不是立即显而易见的。
我更喜欢一个不涉及将 UUID 转换为索引或另一列中的另一种类型的解决方案,因为我不想编写带有转换的专门查询(我们使用 django ORM 来生成查询 atm)。
GIN 索引是可能的。但不是在 Postgres 11 之前添加的。发行说明:
允许
btree_gin索引bool、bpchar和数据name类型uuid(Matheus Oliveira)
因此,简单的解决方案是升级到 Postgres 11。这对您来说应该是个好消息:
2019 年 4 月 9 日:Cloud SQL 现已支持 PostgreSQL 版本 11.1 Beta
或者,在许多情况下,您可以选择使用GiST 索引,Postgres 10 中已经引入了相同的索引。发行说明:
为数据类型添加索引支持 btree_gist
UUID(Paul Jungwirth)
有关的:
如果两者都不是一个选择,那么您又回到了您想要避免的情况:
将 uuid 转换为索引中的另一种类型
您可以在(一致!)表示上创建表达式索引text,或者理论上,在bigint从uuid. 但第一个使索引变得更大、速度更慢,而第二个则造成更多的复杂性......
不过,强制转换的语法很简单:uuid::text。在需要一组额外括号的索引表达式中。安装附加模块后btree_gin:
CREATE INDEX ix_uuid_tsv ON text_information USING GIN ((client_id::uuid), tsv);Run Code Online (Sandbox Code Playgroud)
有关的:
或者您可以从 Postgres 11 向后移植该功能 - 正如您在评论中提到的那样,这对于像 Google Cloud SQL for PostgreSQL 这样的托管服务来说不是一个选项。我几乎看不到这样的用例:一个人有足够的技能来实现向后移植,但不升级到 Postgres 11。
| 归档时间: |
|
| 查看次数: |
5365 次 |
| 最近记录: |