当生成PostgreSQL查询的执行计划时,索引的填充因子如何影响索引是否被用于顺序扫描?
我和一个开发伙伴正在检查PostgreSQL(12.4)查询的性能,其中包含row_number() OVER (PARTITION BY x, y, z)
的窗口函数,看看我们是否可以在这些字段上添加索引来加快查询速度。我们发现,在查询过程中,如果使用填充因子>= 80而不是75创建索引,则会使用索引。这对我们来说是一个惊喜,因为我们没有期望在创建查询计划时考虑填充因子。
如果我们在75处创建索引,然后插入行,从而打包页面>75,然后再次使用指数。是什么原因导致了这种行为?在频繁插入和删除并定期清空的表上选择索引的填充因子时,我们是否应该考虑到这一点?
如果我们在75处创建索引,然后插入行,从而打包页面>75,然后再次使用索引。
所以,不是填充因子,而是索引的大小(受填充因子的影响)。这与我的记忆一致,即索引大小对成本估算的影响(相当微弱)。如果只读取一个元组,则影响几乎为零,但如果读取多个元组,则影响更大。如果计划的成本估计彼此接近,那么像这样的小差异将足以使一个人超过另一个人。但这并不意味着你应该担心它们。如果一个计划明显优于另一个计划,那么您应该考虑为什么开始时的估计如此接近,而实际情况却不接近。