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

时间:2018-09-21 13:34:02

标签: postgresql fragmentation defragmentation

我已经找到了如何在SQL Server here中解决此问题的方法-但是我如何在PostgreSQL中做到这一点?

2 个答案:

答案 0 :(得分:2)

通常,您完全不必担心。

但是,如果进行了大规模删除或更新,或者持续的更改率如此之高,以至于自动真空无法跟上,您的索引最终可能会肿。

确定ID为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

答案 1 :(得分:1)

对于PostgreSQL索引,碎片整理通常应由Autovacuum daemon自动进行。如果您不使用autovacuum守护程序,或者它无法跟上,则可以随时reindex problematic indexes

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