使用索引缓慢更新查询表

时间:2014-12-30 15:41:26

标签: postgresql indexing sql-update

我的桌子上有4个索引。当我运行像这样的更新查询

UPDATE table SET column_without_indexes = true;

它运行速度很慢,比如700k行超过10分钟。 但是如果我在运行查询之前删除表中的所有索引 - 它将在30秒内运行。

我无法理解,为什么UPDATE查询因为在列上添加索引而变慢,甚至没有更新?

1 个答案:

答案 0 :(得分:0)

是的,UPDATE是DELETE + INSERT。

如果你想要一个这样的例子,拿一个表简单查找表(里面有几条记录)并取表的第一条记录并更新它。说出类似的话:

update table set [col1] = [col1]
where table_id = ?

这样做只是为了演示而更新单个记录。

然后在表格上运行一个选择,您将看到该表格顶部的WAS现在位于BOTTOM。

这是SQL处理和更新的标准。

它实际上丢弃了OLD记录并插入了一条新记录。它没有打扰旧的记录。

很明白,当你对所有这些700k行进行更新时,它正在对700k行进行DELETE + INSERT并且全新地对它们进行索引并一次性完成所有操作(因此它最终会在内存中保留很多当你正在处理TRANSACT SQL时 - 基本上它将所有东西保存在内存中,直到完全提交为止。)

所以也许您可以想出另一种方式来进行更新,或者只是一次提供10k行或类似的东西。