我想在 PostgreSQL 中对一个表进行大规模更新,但是我不需要在整个操作中维护事务完整性,因为我知道在更新过程中不会写入或读取要更改的列。我想知道是否有一个简单的方法 在 psql 控制台中使这些类型的操作更快。
例如,假设我有一个名为“ order”的表,其中有3500万行,我想这样做:
UPDATE orders SET status = null;
为了避免转移到非主题讨论,让我们假设3500万列的所有 status 值当前都被设置为相同的(非空)值,从而使索引变得无用。
此语句的问题在于生效需要很长的时间(完全由于锁定) ,并且所有更改的行都被锁定,直到完成整个更新。此更新可能需要5个小时,而类似于
UPDATE orders SET status = null WHERE (order_id > 0 and order_id < 1000000);
可能需要1分钟。超过3500万行,完成以上操作并将其分成35个行只需要35分钟,节省了我4小时25分钟。
我可以用一个脚本(在这里使用伪代码)进一步分解它:
for (i = 0 to 3500) {
db_operation ("UPDATE orders SET status = null
WHERE (order_id >" + (i*1000)"
+ " AND order_id <" + ((i+1)*1000) " + ")");
}
这个操作可能在几分钟内完成,而不是35分钟。
所以这就是我真正想问的。我不想写一个该死的脚本来分解操作每次我想做一个像这样的大一次性更新。有没有一种方法可以完全在 SQL 中实现我想要的结果?