我正在尝试在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);
但我收到此错误:
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
。我不认为Composite / btree_gin因素实际上是相关的,因为尝试仅在client_id
上创建索引时会遇到相同的错误,但是希望如果有解决方案,那将是可行的还带有复合索引。
我发现PostgreSQL GIN index on array of uuid,这似乎表明应该可行(如果可以完成一个UUID数组,那么可以确定一个单独的UUID)。但是,该解决方案对我来说并不透明-如何修改此解决方案以支持单个UUID还不是很明显。
我更喜欢不涉及将UUID强制转换为索引或另一列中另一种类型的解决方案,因为我宁愿不必编写带有强制类型转换的专门查询(我们使用django ORM生成查询) atm)。
答案 0 :(得分:0)
GIN索引可能 。但在Postgres 11之前没有添加。 The release notes:
允许
btree_gin
索引bool
,bpchar
,name
和uuid
数据类型(Matheus Oliveira)
因此,简单的解决方案是升级到Postgres 11。This对您来说应该是个好消息:
2019年4月9日:Cloud SQL现在支持PostgreSQL版本11.1 Beta
或,在许多情况下,您也可以使用 GiST索引,该索引已在Postgres 10中引入。 The release notes:
为
UUID
数据类型(Paul Jungwirth)的btree_gist添加索引支持
相关:
如果都不是一种选择,那么您又回到了要避免的地方:
将uuid转换为索引中的另一种类型
您可以在(一致!)text
表示形式上创建表达式索引,或者理论上可以在从bigint
派生的两个uuid
列上创建表达式索引。但是第一个使索引变大和变慢,第二个使索引复杂得多……
尽管,强制转换的语法非常简单:uuid::text
。在需要额外括号的索引表达式中。安装了附加模块btree_gin
:
CREATE INDEX ix_uuid_tsv ON text_information USING GIN ((client_id::uuid), tsv);
相关:
或者您可以从Postgres 11向后移植功能-如注释中所提到的,对于诸如PostgreSQL的Google Cloud SQL之类的托管服务,这不是一个选择。而且我几乎看不到用例足以熟练地实现反向移植,而又不升级到Postgres 11的用例。