【问题标题】:postgres vacuum didn't change bloatinesspostgres 真空并没有改变臃肿
【发布时间】:2013-10-02 14:20:26
【问题描述】:

以下是对 heroku 管理的 postgresql 9.2 数据库中的所有表运行手动清理操作之前和之后最臃肿的表。如您所见,变化不大,甚至增加了一些浪费...
可能是什么原因?这是正常行为吗?

之前:

 type  | schemaname |       object_name      | bloat |   waste
-------+------------+------------------------+-------+------------
 index | public     | table_1                |   1.4 | 113 MB
 table | public     | table_2                |   1.1 | 92 MB
 table | public     | table_3                |   1.1 | 70 MB
 index | public     | table_4                |   1.2 | 66 MB
 index | public     | table_5                |   1.2 | 65 MB
 index | public     | table_6                |   1.2 | 64 MB
 index | public     | table_7                |   1.1 | 34 MB
 table | public     | table_8                |   1.1 | 19 MB

之后:

 type  | schemaname |       object_name      | bloat |   waste
-------+------------+------------------------+-------+------------
 index | public     | table_1                |   1.4 | 123 MB
 table | public     | table_2                |   1.1 | 82 MB
 table | public     | table_3                |   1.1 | 82 MB
 index | public     | table_4                |   1.3 | 72 MB
 index | public     | table_5                |   1.3 | 72 MB
 index | public     | table_6                |   1.3 | 71 MB
 index | public     | table_7                |   1.1 | 39 MB
 table | public     | table_8                |   1.1 | 19 MB

【问题讨论】:

  • 您可以使用VACUUM FULL 将表格缩小到最小大小,但效果是暂时的。也不要忘记清理索引。

标签: postgresql heroku-postgres vacuum


【解决方案1】:

如果您需要将表打包到最小大小,请运行 VACUUM FULLVACUUM 不会尝试压缩数据页或释放磁盘空间,除非从表的末尾(这是一种廉价的操作)。

通常,简单的VACUUM 是更可取的方法。死元组占用的空间可以被以后的更新重用,更新的行版本可以通过这种方式写入同一个数据页。如果你把所有东西都打包好,新的行版本总是必须附加到表的末尾。一些 slack 通常提高写入性能 - 除了 只读表,这将是 VACUUM FULL(一次)甚至 CLUSTER 的候选者。

客户端程序vacuumdb-f (--full) 开关。

Much more information in the Postgres Wiki on vacuuming.

【讨论】:

    【解决方案2】:

    Tl;dr 版本:看起来并不奇怪。

    当行被更新或删除时,mvcc 从 txid 开始将旧行标记为死;从该 txid 开始插入一个新的以进行插入和更新。

    自动真空有时会启动,对于正常的数据库操作来说很好。

    真空强制执行自动真空通常定期和局部执行的操作。例如,您可以在大更新或删除后运行它。

    清理的作用基本上是从磁盘页面中删除死行。而且,除非我弄错了,否则通过拆分太满的磁盘页面(如离表的填充因子太远)为未来的新行创建一些新空间,或者通过合并太空的磁盘页面来删除不必要的空间(对于同样的原因)。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 2011-03-18
      • 2011-12-13
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      相关资源
      最近更新 更多