我有一个带有2个GIN索引的小表( gin_idx1和gin_idx2)。在我们的工作运行期间,表大小从50 GB增长到大约1GB高的DML活动。工作完成后,自动真空清除表大小和gin_idx1大小。但gin_idx2一直在增长。使用sql查找索引使用情况--我看到的未用指数没有使用gin_idx2。我们使用的是PG12.4,到目前为止,表大小是50 PG,gin_idx1是20 PG,gin_idx2是20 PG。我知道重新索引将修复它,但为什么自动真空能够处理1 gin指数,而不是另一个。这是某种错误还是一种预期的行为?有什么想法?解释?
发布于 2021-03-23 02:50:03
预期的行为是,自动真空不会收缩表和索引,因此您的gin_idx2正在按预期操作。
如果其他对象收缩,那肯定是因为您正在运行的DELETEs恰好在关系结束时空块。在这种情况下,自动真空将截断那些终端空页。
发布于 2021-03-23 21:47:34
Autovac从不缩小索引,即使从其表中删除所有元组也是如此。因此,不应该是小型索引正在增长,然后就不会缩小,而是通过空间重用来阻止它变得更大。
使用GIN索引(与Btree索引不同),一旦一个值被插入索引,它就永远不会被删除,即使没有活的元组再拥有这个值了。
因此,如果一个GIN索引的值集合很小(例如,英语中的单词是从the结构派生出来的),而另一个索引则是通过一组非常大的可能值(例如,包含其他表的主键值的bigint[],一旦删除就永远不会被重用),那么第一个索引将享受高效的空间重用,而第二个索引将具有“永久性”(如果您永远不会用完64位整数)泄漏。
https://stackoverflow.com/questions/66755779
复制相似问题