避免冗余更新

Bil*_*ill 6 sql oracle plsql

我在IO绑定系统中工作(这不会改变).所以我正在重写一些sql只在需要的时候进行更新,而且它的确很顺利.我发现性能提升了70%.唯一的问题是sql更臃肿,这不是世界末日,只需要维护更多的代码.

所以我的问题是..是否有更简单的方法让Oracle只在需要与添加where子句进行比较时进行更新:

update table_name
   set field_one = 'one'
 where field_one != 'one';
Run Code Online (Sandbox Code Playgroud)

注意:实际代码要复杂得多,因此像这样添加"where"有时可以使查询的长度加倍.

用11g

HLG*_*GEM 6

鉴于SQL的工作方式,这正是您需要做的.如果你告诉它:

update table_name    
   set field_one = 'one';
Run Code Online (Sandbox Code Playgroud)

这意味着在SQL中完全不同的东西

update table_name
   set field_one = 'one'
 where field_one != 'one';
Run Code Online (Sandbox Code Playgroud)

数据库只能处理你告诉它处理的内容.在第一种情况下,因为没有where子句,你告诉它处理所有记录.

在第二种情况下,您在其上放置了一个过滤器,以仅处理某些特定记录.

由代码编写者而不是数据库来确定查询的内容.如果您不希望每条记录都更新,那么您不应该告诉它这样做.数据库对于您提供的命令非常直观.是的,第二组查询更长,因为它们更具体.它们具有与原始查询不同的含义.这就是好事,因为更新您感兴趣的十条记录要比表中的所有1,000,000条记录快得多.

你需要克服这样的想法:在数据库查询中,更长的时间在某种程度上是一件坏事.通常,这是一件好事,因为你在要求的方面更正确.您的原始查询完全不正确.而现在你已经付出了代价来修复一个系统性的不良做法.