如何在Postgres 9.6中为uuid添加PostgreSQL GIN索引

3

我想在Postgres 9.6数据库中添加一个包含UUID的GIN索引。从技术上讲,它是一个复合索引,并且使用btree_gin插件支持复合GIN。

我尝试使用以下语句创建索引:

CREATE EXTENSION btree_gin;
CREATE INDEX ix_tsv ON text_information USING GIN (client_id, text_search_vector);

但是我遇到了这个错误:
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 创建索引时出现了相同的错误,但希望如果有解决方案,它也可以与复合索引一起使用。

我找到了PostgreSQL GIN index on array of uuid,它似乎表明这应该是可能的(如果可以做一个 UUID 数组,那么一个单独的 UUID 也肯定可以)。然而,那里的解决方案对我来说相当难懂 - 不太容易知道如何修改此解决方案以支持单个 UUID。

我希望找到一个不涉及将 UUID 转换为索引或另一列的其他类型的解决方案,因为我不想编写带有转换的专门查询(我们目前正在使用 Django ORM 生成查询)。

1个回答

5

GIN索引可以实现。但是在Postgres 11之前还没有这个功能,Postgres 11中才添加了此功能。发布说明:

允许btree_ginboolbpcharnameuuid数据类型进行索引(Matheus Oliveira)

因此,简单的解决方案是升级到Postgres 11。 对您来说应该是个好消息:

2019年4月9日:Cloud SQL现在支持PostgreSQL 11.1 Beta版本

或者,在许多情况下,您可以选择使用GiST索引,这个功能已经在Postgres 10中引入了。发布说明:

UUID 数据类型添加 btree_gist 索引支持 (Paul Jungwirth)。
相关: 如果以上两种方法都不可行,那么只能回到你想要避免的地方:

将uuid强制转换为索引中的另一种类型

您可以在一个(一致的!)text 表示或者理论上从 uuid 派生出来的两个 bigint 列上创建表达式索引。但第一种方法会使索引变得更大、更慢,而第二种方法则会创建更多的复杂性...
强制转换的语法非常简单: uuid::text。在索引表达式中需要额外加上一组括号。如果安装了额外模块btree_gin,则可以使用。
CREATE INDEX ix_uuid_tsv ON text_information USING GIN (<b>(client_id::uuid)</b>, tsv);

相关文章:

或者您可以从Postgres 11中回溯该功能-但像您在评论中提到的Google Cloud SQL for PostgreSQL这样的托管服务不支持此选项。我几乎看不出有哪种用例可以熟练实现回溯,但无法升级到Postgres 11。


很遗憾,我们正在使用来自Google Cloud的托管Postgres解决方案,因此无法升级到9.6以上版本。 - Michael Nelson
很不幸。你又回到了你不想去的地方... - Erwin Brandstetter
1
在Cloud Next '19上,Michael Nelson宣布PostGreSQL 11现已作为beta版发布:“自去年普及后,Cloud SQL for PostgreSQL成为GCP上增长最快的数据库之一。我们听到您想要最新版本,因此我们很高兴地宣布支持PostgreSQL版本11,其中包括有用的新功能,如分区改进、存储过程和更多并行性。”来源:https://cloud.google.com/blog/products/databases/enterprise-databases-managed-for-you - benvdh
@benvdh:刚刚在发布说明中找到并添加了相同的内容。 :) - Erwin Brandstetter
我曾经在9.6版本中遇到过这个问题,但我们只需要升级到Postgres 10而不是11就可以解决这个问题。 - Simbosan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接