gpt4 book ai didi

postgresql - 带有 pg_total_relation_size 的 postgres 9.2 表大小

转载 作者:行者123 更新时间:2023-11-29 14:23:00 29 4
gpt4 key购买 nike

我按以下方式处理一个包含 ~10^7 行的表:获取最后 N 行,以某种方式更新它们,然后删除,然后 vacuum 表。最后,我查询了 pg_total_relation_size。循环重复直到表格结束。每次迭代持续数秒。除了上面提到的之外,没有对该表的任何其他查询。问题是我得到了相同的表大小结果。它大约每隔几个小时更改一次。

所以问题是——postgres 是将表大小存储在某处还是每次调用该函数时都计算它?即,尽管经过处理,我的表格大小真的保持不变吗?

最佳答案

尽管您正在执行 DELETEVACUUMing,但您的表确实在磁盘上保持相同的大小。根据 the documentation on VACUUM ,普通的 VACUUM 仅在可以通过从文件末尾截断可用空间而不重新排列事件行的情况下将空间释放回操作系统。

该空间仍然是“空闲的”,因为 PostgreSQL 可以将它重新用于其他新行。与使用新空间扩展关系相比,重用 PostgreSQL 尚未返回给操作系统的空间要快得多,因此这通常更可取。

Pg 不只是返还这个空间的另一个原因是它只能在文件末尾之前没有可见行的连续 block 时将空间返还给操作系统。这种情况很少发生,所以在实践中 Pg 需要移动一些行来压缩表并允许它在最后释放空间,有点像文件系统上的碎片整理。这是一个低效且缓慢的过程,可能会违反直觉地使表的访问速度变慢而不是变快,因此这并不总是一个好主意。

如果你有一个大部分但不完全为空的关系,那么值得做一个 VACUUM FULL(Pg 9.0 及以上)或 CLUSTER(所有版本)来释放空间。如果您希望重新填满 table ,这通常会适得其反;实际上最好保持原样。

(关于“事件”和“可见”等术语的含义,请参阅 documentation on MVCC,这将帮助您理解 Pg 的表组织。)

就您而言,我个人会跳过手册 VACUUM。如果需要,请打开 autovacuum。如果您真的需要,您可以考虑对您的表进行分区,逐个分区地对其进行处理,并在完成处理后对每个分区进行TRUNCATE

关于postgresql - 带有 pg_total_relation_size 的 postgres 9.2 表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15612754/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com