PostgreSQL 可以使用 HASH 排除约束来实现唯一性吗?

PostgreSQL OK to use HASH exclude constraint for uniqueness?

由于哈希比冗长的文本小,在我看来,它们可能比 b 树更可取,以确保列的唯一性。

仅出于确保唯一性的目的,以下内容在 PG 10 中是否可行?

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

我假设哈希冲突是在内部处理的。否则就没用了。

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

我认为 quoting the manual 总结如下:

Although it's allowed, there is little point in using B-tree or hash indexes with an exclusion constraint, because this does nothing that an ordinary unique constraint doesn't do better. So in practice the access method will always be GiST or SP-GiST.

更何况你还是想创建一个 GiST 索引。 USING GIST 的排除约束将自动创建一个匹配的 GiST 索引作为实现细节。维护另一个甚至未在查询中使用的低效哈希索引毫无意义。

对于简单的唯一性 (WITH =),普通的 UNIQUE btree 索引更有效。如果您的密钥很长,请考虑在散列 expression 上使用 唯一索引 (使用任何不可变函数)以减小大小。喜欢:

CREATE UNIQUE INDEX test_path_hash_uni_idx ON test (my_hash_func(path));

相关:

  • How does PostgreSQL enforce the UNIQUE constraint / what type of index does it use?

md5() 将是一个简单的哈希函数选项。

Postgres 10 之前,不鼓励使用散列索引。但是with the latest updates,这已经改善了。 Robert Haas(核心开发人员)在一篇博文中对此进行了总结:

CREATE INDEX test_path_hash_idx ON test USING HASH (path);

唉(在我的草稿中遗漏了这一点),访问方法 "hash" 还不支持唯一索引。所以我仍然会在上面的哈希表达式上使用唯一索引。 (但是没有减少信息的哈希函数可以完全保证密钥的唯一性——这可能是也可能不是问题。)