由于散列小于冗长的文本,在我看来,它们可能比b-tree更受欢迎,以确保列的唯一性。
出于确保唯一性的唯一目的,PG 10中是否存在以下任何原因?
CREATE TABLE test (
path ltree,
EXCLUDE USING HASH ((path::text) WITH =)
);
我认为哈希冲突是在内部处理的。否则会毫无用处。
我将使用GiST
索引进行查询增强。
答案 0 :(得分:4)
我认为quoting the manual总结了这一点:
虽然这是允许的,但使用B树或哈希没什么意义 具有排除约束的索引,因为这不会做任何事情 普通的唯一约束并没有做得更好。所以在实践中,访问方法将始终是GiST或SP-GiST。
因为你想要创建一个GiST索引所以更是如此。 USING GIST
的排除约束将自动创建匹配的GiST索引作为实现细节。没有必要维护另一个低效的哈希索引甚至不用于查询。
对于简单唯一性(WITH =
),普通UNIQUE
btree索引更有效。如果您的密钥很长,请考虑哈希expression上的唯一索引(使用任何不可变函数)来减小大小。像:
CREATE UNIQUE INDEX test_path_hash_uni_idx ON test (my_hash_func(path));
相关:
md5()
将是一个简单的选项作为哈希函数。
在 Postgres 10 之前,不建议使用哈希索引。但是with the latest updates,这已经有所改善。 Robert Haas(核心开发人员)在一篇博客文章中总结道:
CREATE INDEX test_path_hash_idx ON test USING HASH (path);
唉(在我的草稿中错过了),访问方法“hash”还不支持唯一索引。所以我仍然会在上面的哈希表达式中使用唯一索引。 (但是没有减少信息的哈希函数可以完全保证密钥的唯一性 - 这可能是也可能不是问题。)