6

我在这里找到了我们如何在 SQL Server 中解决这个问题- 但我如何在 PostgreSQL 中解决这个问题?

4

2 回答 2

12

通常,您根本不必担心这一点。

但是,如果发生了大规模删除或更新,或者持续更改率如此之高以至于 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% 的膨胀率。

请注意,默认情况下,索引是使用fillfactor90 创建的,也就是说,索引块的填充率不会超过 90% INSERT

指数何时膨胀很难说,但如果leaf_fragmentation超过 50-60,就不是那么漂亮了。

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

于 2018-09-21T17:27:16.173 回答
3

使用 PostgreSQL 索引碎片整理通常应该由Autovacuum 守护进程自动处理。如果您不使用 autovacuum 守护程序,或者它无法跟上,您始终可以重新索引有问题的索引

确定哪些索引可能被严重碎片化并不是特别简单,并且在这篇博文和这篇 PostgreSQL wiki 文章中进行了详细讨论。

于 2018-09-21T14:50:05.353 回答