PostgreSQL可以使用HASH排除约束的唯一性吗?

时间:2017-12-26 09:04:47

标签: postgresql indexing unique-index ltree postgresql-10

由于散列小于冗长的文本,在我看来,它们可能比b-tree更受欢迎,以确保列的唯一性。

出于确保唯一性的唯一目的,PG 10中是否存在以下任何原因?

CREATE TABLE test (
  path ltree,
  EXCLUDE USING HASH ((path::text) WITH =)
);

我认为哈希冲突是在内部处理的。否则会毫无用处。

我将使用GiST索引进行查询增强。

1 个答案:

答案 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”还不支持唯一索引。所以我仍然会在上面的哈希表达式中使用唯一索引。 (但是没有减少信息的哈希函数可以完全保证密钥的唯一性 - 这可能是也可能不是问题。)