首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

一次完成多个更新

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),来处理那些符合更新条件的数据记录,并且更新条件可以有多条。

总结:有可能的话,用一个语句处理多个更新;尽量减少对同一个表的重复访问。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论