我无法直接使用uuid与gist索引
CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry
USING gist
(id_leaderboard , value);
我遇到了以下错误:
错误:数据类型uuid在访问方法“gist”中没有默认运算符类别
提示:您必须为索引指定一个运算符类,或者为该数据类型定义一个默认运算符类。
我无法直接使用uuid与gist索引
CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry
USING gist
(id_leaderboard , value);
我遇到了以下错误:
错误:数据类型uuid在访问方法“gist”中没有默认运算符类别
提示:您必须为索引指定一个运算符类,或者为该数据类型定义一个默认运算符类。
btree_gist现在也支持uuid
这种数据类型,正如Paul所评论的那样。(还有其他一些数据类型,尤其是所有的enum
类型。)
现在您只需要为每个数据库安装一次扩展即可:
CREATE EXTENSION btree_gist;
那么你的索引应该可以正常工作。
相关:
(原始回答。)
通常我会建议使用额外的模块btree_gist,但是类型uuid
没有被其覆盖。
理论上,由于UUID是128位数量
(根据文档),最有效的方法是将其转换为两个bigint
或float8
以用于索引目的。但这些类型转换都未在标准的Postgres中定义。
我在pgsql-hackers列表中发现了一个与此相关的讨论,但它似乎没有成功。
剩下的选择是在text
表示上使用功能GiST索引:
CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));
为了使用这个函数索引,查询必须匹配该表达式。您可以在查询中使用简写"value"::text
(但在索引定义中不加括号不起作用)。
补充一点:不要使用value
作为列名,它是标准SQL中的保留字。
问题是:为什么需要GiST索引。最佳解决方案取决于目标。
btree_gist
支持UUID,因此您不再需要进行强制转换。 - Paul A Jungwirth如果您正在使用Postgres 10,并且通过dump/restore从先前的版本迁移数据库,则可能需要运行以下命令:
ALTER EXTENSION btree_gist UPDATE;