如何在postgresql gist索引类型中使用uuid?

时间:2014-03-28 18:05:29

标签: postgresql indexing uuid gist-index

我不能直接使用带有gist索引的uuid

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

我收到了这个错误:

  

错误:数据类型uuid没有访问方法的默认运算符类   “要旨”

     

提示:您必须为索引指定运算符类或定义a   数据类型的默认运算符类。

2 个答案:

答案 0 :(得分:10)

Postgres 10或更新

btree_gist现在也涵盖了数据类型uuid,例如Paul commented。 (以及其他一些数据类型,尤其是所有enum类型。)

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

CREATE EXTENSION btree_gist;

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

相关:


Postgres 9.6或更早

(原始答案。)
通常我会建议额外的模块btree_gist,但类型uuid

理论上,由于UUID是a 128-bit quantityper documentation),因此最有效的方法是将其转换为两个bigintfloat8。指数。但是这些演员阵容都没有在标准的Postgres中定义。

我找到了stab in that direction in the pqsql-hackers list,但似乎没有成功。

其余选项是text表示的函数GiST索引:

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

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

除此之外:不要将value用作列名,而是reserved word in standard SQL

问题是:为什么您需要GiST索引吗?最好的解决方案取决于目标。

答案 1 :(得分:1)

如果您正在使用Postgres 10,并且使用转储/恢复从先前版本迁移数据库,则可能需要运行:

ALTER EXTENSION btree_gist UPDATE;

为了让gist索引与UUID一起使用。