如何找出碎片索引并在 PostgreSQL 中对其进行碎片整理?

How to find out fragmented indexes and defragment them in PostgreSQL?

我已经找到如何在 SQL 服务器 here 中解决这个问题 - 但我如何在 PostgreSQL 中解决这个问题?

对于 PostgreSQL 索引碎片整理通常应该由 Autovacuum daemon. If you don't use the autovacuum daemon, or if it isn't able to keep up, you can always reindex problematic indexes 自动处理。

确定哪些索引可能严重碎片化并不是特别简单,this blog post and in this PostgreSQL wiki article 中对此进行了详细讨论。

通常情况下您完全不必担心。

但是,如果存在大量删除或更新,或者持续变化率太高以至于 autovacuum 跟不上,您可能会得到一个严重膨胀的索引。

确定 pgstattuple 扩展名的工具:

CREATE EXTENSION pgstattuple;

然后你可以这样检查索引膨胀:

SELECT * FROM pgstatindex('spatial_ref_sys_pkey');

-[ RECORD 1 ]------+-------
version            | 2
tree_level         | 1
index_size         | 196608
root_block_no      | 3
internal_pages     | 1
leaf_pages         | 22
empty_pages        | 0
deleted_pages      | 0
avg_leaf_density   | 64.48
leaf_fragmentation | 13.64

这个指数非常好(从未使用过):它只有 14% 膨胀。

请注意,默认情况下创建的索引 fillfactor 为 90,也就是说,索引块不会被 INSERT 填充到超过 90%。

很难说索引什么时候膨胀,但是如果leaf_fragmentation超过50-60,就不太好看了。

要重新组织索引,请使用 REINDEX