一次完成多个更新
Multiple Updates at Once
我的基本主张是:如果每次更新的是彼此无关的记录,对一张表连续进行多次update操作还可以接受;否则,就应该把它们合并成一个update操作。例如,下面是来自实际应用的一些代码(注4):
update tbo_invoice_extractor
set pga_status = 0
where pga_status in (1,3)
and inv_type = 0;
update tbo_invoice_extractor
set rd_status = 0
where rd_status in (1,3)
and inv_type = 0;
两个连续的更新是对同一个表进行的。但它们是否将访问相同的记录呢?不得而知。问题是,搜索条件的效率有多高?任何名为type或status的字段,其值的分布通常是杂乱无章的,所以上面两个update语句极可能对同一个表连续进行两次完整扫描:一个update有效地利用了索引,而第二个update不可避免地进行全表扫描;或者,幸运
的话,两次update都有效地利用了索引。无论如何,把这两个update合并到一起,几乎不会有损失,只会有好处:
update tbo_invoice_extractor
set pga_status = (case pga_status
when 1 then 0
when 3 then 0
else pga_status
end),
rd_status = (case rd_status
when 1 then 0
when 3 then 0
else rd_status
end)
where (pga_status in (1,3)
or rd_status in (1, 3))
and inv_type = 0;
上例中,可能出现重复更新相同字段为相同内容的情况,这的确增加了一小点儿开销。但在多数情况下,一个update会比多个update快得多。注意上例中的“逻辑(logic)”,我们通过case 语句实现了隐式的条件逻辑(implicit conditional logic),来处理那些符合更新条件的数据记录,并且更新条件可以有多条。
总结:有可能的话,用一个语句处理多个更新;尽量减少对同一个表的重复访问。






