由于哈希比长文本小,所以在我看来,它们可能比b树更受欢迎,以确保列的唯一性。
出于确保唯一性的唯一目的,PG 10中是否存在以下任何原因?
CREATE TABLE test (
path ltree,
EXCLUDE USING HASH ((path::text) WITH =)
);
我假设哈希冲突是内部处理的。否则将毫无用处。
我将使用GiST
索引进行查询增强。
我认为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”还不支持唯一索引。所以我仍然会在上面的哈希表达式中使用唯一索引。 (但是没有减少信息的哈希函数可以完全保证密钥的唯一性 - 这可能是也可能不是问题。)