为什么部分 PostgreSQL HASH 索引不小于完整索引?

Ort*_*ntz 5 postgresql index index-tuning postgresql-10

我想为人口稀少的列创建最有效的索引。我只需要相等操作,所以 HASH 索引应该是有益的。

现在我想知道为什么部分哈希索引不小于完整哈希索引:

CREATE INDEX full_hash    ON mytable USING HASH(my_id); # 256 MB
CREATE INDEX partial_hash ON mytable USING HASH(my_id) WHERE my_ID IS NOT NULL; # 256 MB

CREATE INDEX full_btree    ON mytable (my_id); # 537 MB
CREATE INDEX partial_btree ON mytable (my_id) WHERE my_ID IS NOT NULL; # 32 MB
Run Code Online (Sandbox Code Playgroud)

两个哈希索引占用的空间量完全相同(如 pgHero 所示)。但是,在使用标准 BTREE 索引时,部分索引仅占用完整索引空间的 5%。

PostgreSQL 10 不支持部分 HASH 索引吗?

jja*_*nes 6

我认为这是哈希索引代码中的错误。当您在已填充的表上创建索引时,它会尝试预先调整索引的大小以保存所有数据,以便在创建索引时不必继续拆分存储桶。但是执行此操作的代码没有考虑列的 NULL 部分,也没有(显然)考虑部分索引子句的选择性,因此它得出的预调整数字太大。

如果你先创建索引,然后填充表,你会发现哈希索引很小,不管你是否做了部分。如果表在创建索引后会大幅增长,那么索引在最初创建时消耗的额外空间将得到很好的利用。

  • 我已经在开发人员邮件列表 (https://www.postgresql.org/message-id/flat/CAMkU%3D1x0k%2BdRQHDUgp4BjFeSgxyLBBXyKNY5Pt1Yu6YHB0mhKA%40mail.gmail.com) 上开始了一个线程,如果这里有人想关注它. (3认同)