我的桌子上有4个索引。当我运行像这样的更新查询
UPDATE table SET column_without_indexes = true;
它运行速度很慢,比如700k行超过10分钟。 但是如果我在运行查询之前删除表中的所有索引 - 它将在30秒内运行。
我无法理解,为什么UPDATE查询因为在列上添加索引而变慢,甚至没有更新?
答案 0 :(得分:0)
是的,UPDATE是DELETE + INSERT。
如果你想要一个这样的例子,拿一个表简单查找表(里面有几条记录)并取表的第一条记录并更新它。说出类似的话:
update table set [col1] = [col1]
where table_id = ?
这样做只是为了演示而更新单个记录。
然后在表格上运行一个选择,您将看到该表格顶部的WAS现在位于BOTTOM。
这是SQL处理和更新的标准。
它实际上丢弃了OLD记录并插入了一条新记录。它没有打扰旧的记录。
很明白,当你对所有这些700k行进行更新时,它正在对700k行进行DELETE + INSERT并且全新地对它们进行索引并一次性完成所有操作(因此它最终会在内存中保留很多当你正在处理TRANSACT SQL时 - 基本上它将所有东西保存在内存中,直到完全提交为止。)
所以也许您可以想出另一种方式来进行更新,或者只是一次提供10k行或类似的东西。