我正在对数据库执行更新,该数据库将15位数字插入到单个列的270,000,000行中。我认为所需的空间应该在4GB左右,但它仍在运行,事务日志刚刚达到180GB。
答案 0 :(得分:1)
交易必须存储大量信息,以防万一需要回滚更改。
需要有一个顺序值来知道记录的更新/插入顺序。它需要存储列的原始值(某些RDBMS甚至可能存储整行!)。它需要一个唯一的标识符来将数据绑定回行的位置
它必须存储如此多的数据,因为如果发生灾难性事件 - 比如数据库崩溃 - 它需要能够返回到一致的状态。
是的,15位* 270 mil可能会达到4 GB,但这完全忽略了所有非常重要的元数据。
如果这是不需要重复的一次性更新,则可以更快地重新创建更新列的表。与插入/更新/删除相比,表格从选择中创建几乎不需要任何事务记录。
答案 1 :(得分:0)
可能由于添加了大量数据而导致所有页面被拆分(4/180 = 2.2%;可能看起来不太重要,但可能会将许多页面推到边缘)。
使用fillfactor重建聚集索引(可能90就足够了)。然后,更新时不会有任何页面拆分。
如果这没有帮助,我们需要深入挖掘。
在任何情况下都会有显着的日志增长,肯定会超过4GB。 180听起来太多了。这听起来像存储了整个页面。