11

I can't use directly uuid with gist index

CREATE INDEX idx_leaderboads_values_gist
  ON leaderboard_entry
  USING gist
  (id_leaderboard , value);

And I got this error:

ERROR: data type uuid 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.

4

2 回答 2

13

Postgres 10 或更新版本

btree_gist现在也涵盖了数据类型uuid,就像Paul 评论的那样。(以及其他一些数据类型,尤其是所有enum类型。)

现在您需要做的就是:为每个数据库安装一次扩展:

CREATE EXTENSION btree_gist;

那么您的索引应该可以正常工作。

有关的:


Postgres 9.6 或更高版本

(原始答案。)
通常我会建议附加模块btree_gist 但类型uuid不包括在内。

理论上,由于 UUID 是a 128-bit quantity根据文档),因此最有效的方法是将其转换为两个bigintfloat8用于索引的目的。但是这些转换都没有在标准 Postgres 中定义。

在 pqsql-hackers list 中发现了朝那个方向的刺,但似乎没有成功。

剩下的选项是表示的功能性 GiST 索引text

CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));

要使用此功能索引,查询必须匹配该表达式。您可以在查询中使用速记"value"::text(但不能在索引定义中不添加更多括号)。

另外:不要value用作列名,它是标准 SQL 中的保留字

问题是:为什么需要 GiST 索引。最佳解决方案取决于目标。

于 2014-03-28T18:34:34.003 回答
4

如果您使用的是 Postgres 10,并且您使用转储/恢复从以前的版本迁移了数据库,您可能需要运行:

ALTER EXTENSION btree_gist UPDATE;

为了让 gist 索引与 UUID 一起工作。

于 2018-02-13T01:36:26.490 回答