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 索引吗?
我认为这是哈希索引代码中的错误。当您在已填充的表上创建索引时,它会尝试预先调整索引的大小以保存所有数据,以便在创建索引时不必继续拆分存储桶。但是执行此操作的代码没有考虑列的 NULL 部分,也没有(显然)考虑部分索引子句的选择性,因此它得出的预调整数字太大。
如果你先创建索引,然后填充表,你会发现哈希索引很小,不管你是否做了部分。如果表在创建索引后会大幅增长,那么索引在最初创建时消耗的额外空间将得到很好的利用。