我想知道什么时候在相对较大的表(几百 GB)上重建 BTree 索引才有意义。
对我来说,任何高于 30% 或 40% 的值似乎都是不错的候选者,但我看到有人说即使 70% 对于 Postgres 来说也不算太糟糕。pgstattuple.pgstatindex
如果重要的话,我会从功能中得到碎片。
我想知道什么时候在相对较大的表(几百 GB)上重建 BTree 索引才有意义。
对我来说,任何高于 30% 或 40% 的值似乎都是不错的候选者,但我看到有人说即使 70% 对于 Postgres 来说也不算太糟糕。pgstattuple.pgstatindex
如果重要的话,我会从功能中得到碎片。
这取决于™。碎片本身并没有好坏之分,它只是索引的一个属性。如果您的所有查询都扫描索引以获取唯一值,则在任何情况下它们最多都会读取少数页面,因此索引是否碎片并不重要。另一方面,如果您经常扫描大范围的页面,大量空白页面可能会造成伤害。您需要查看 I/O 统计数据来决定什么是可接受的。
我认为
leaf_fragmentation
这可能不是一个很好的指示,但我很乐意向更了解的人学习。根据代码,它是后续叶页具有较低块号的叶页的百分比。如果您扫描存储在旋转 Rust 上的索引的较大部分,那么这可能很有意义,但除此之外别无其他。对我来说,重要的专栏是
avg_leaf_density
. 如果太低,您的索引就会臃肿且效率低下。什么价值观是可以的这个问题是一个难题。我想说超过 30% 就可以了,但 20% 也不算太糟糕。
如果您不确定是否重建索引,请询问自己以下问题:
如果您观察随着时间的推移膨胀,它会持续增加吗?如果是,那就不好了,a
REINDEX
可能是必要的。如果肿胀持续较高,但没有增加,
REINDEX
请观察一次这会提高您的应用程序的性能吗?
索引是否会再次变得臃肿,直到像以前一样臃肿?
如果第二个问题回答为“否”,则建议不要考虑该指数。
如果您决定这样做
REINDEX
,请探索受影响表上更积极的 autovacuum 设置是否可以抑制膨胀。