我有一个表,聚集在两列上(销售点和产品 ID)。唯一的索引位于这两列中,并且表聚集在这些列上。
我每周都会更新表中的其他列。当我这样做时,表和关系的大小增加了大约 5 倍。然后,我对表进行聚类,大小恢复到更新前的大小。
这对我来说似乎很奇怪。如果我要更新索引列,我预计需要通过清理来处理一些膨胀,但由于索引列没有被任何更新修改,我不明白为什么更新表会导致以增加尺寸。
这是否按预期工作,或者这是否表明我的配置存在问题?有办法阻止这种情况吗?
[Windows 7 上的 Postgres 9.1]
即使没有索引列,PostgreSQL 仍然需要做MVCC http://www.postgresql.org/docs/current/static/mvcc-intro.html更新写入新行的位置,然后清理并丢弃旧行。否则,如果中途出现错误或崩溃,它无法回滚事务。 (PostgreSQL 没有撤消日志,它使用堆来代替)。
热门更新 http://pgsql.tapoueh.org/site/html/misc/hot.html仅当页面中有足够的可用空间以避免必须将新行写入不同的页面(然后必须创建新的索引条目)时才能完成。因此,即使您没有更新索引列,PostgreSQL 仍然必须将新行写入表末尾的新页,因为当前页上没有地方可以放置新行版本。
我通常只期望空间加倍,但如果您正在进行一系列更新,而中间没有真空赶上,那么预计会增加更多。尝试一次性完成所有更新或VACUUM
通行证之间。
为了使更新速度更快,需要消耗一些磁盘空间,ALTER TABLE
设置非 100FILLFACTOR
在你面前的桌子上CLUSTER
它。我建议45
,每行有足够的空间容纳一个新版本,再加上一点摆动空间。这将使表的大小增加两倍,但会减少所有重写的干扰。它会让热更新发生并加速更新,因为不需要一直扩展关系。
最重要的是 - 尝试找到一种方法来避免定期批量更新整个表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)