sql - 避免冗余更新

标签 sql oracle plsql

我在一个 IO 绑定(bind)系统中工作(这不会改变)。因此,我正在重写一些 sql,以便仅在需要时进行更新,并且进展顺利。我看到性能提高了大约 70%。唯一的问题是 sql 更臃肿,这不是世界末日,只是需要维护更多代码。

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

update table_name
   set field_one = 'one'
 where field_one != 'one';

注意:实际代码要复杂得多,因此添加这样的“where”有时会使查询的长度加倍。

使用 11g

最佳答案

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

update table_name    
   set field_one = 'one';

这意味着在 SQL 中完全不同于
update table_name
   set field_one = 'one'
 where field_one != 'one';

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

在第二种情况下,您对其进行了过滤以仅处理某些特定记录。

取决于代码作家 不是数据库来确定查询的内容。如果您不希望更新每条记录,则不应该告诉它这样做。数据库对您给它的命令非常字面。是的,第二组查询更长,因为它们更具体。它们与原始查询具有不同的含义。这一切都很好,因为更新您感兴趣的 10 条记录比更新表中的所有 1,000,000 条记录要快得多。

你需要克服这样的想法,即更长的时间在数据库查询中是一件坏事。通常这是一件好事,因为您对自己的要求更加正确。您的原始查询根本不正确。现在,您已经为解决系统性不良做法付出了代价。

关于sql - 避免冗余更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25003475/

相关文章:

sql - a 和 b 之间的数字 - a 不包含在内,b 包含在内

mysql - 哪个是数据库状态值的更好设计?

sql - 如何选择名称以相同前缀开头的列?

oracle - 在 sqlplus 中使用 spool 运行多个查询

sql - 左外连接与子查询?

sql - 无法在 SQL Server 中保存数据库默认位置

sql - 使每隔一行的值出现在新的第三列中

sql - 在oracle中一行显示多行数据

sql - 以另一个用户身份执行 Oracle 存储过程

oracle - 将十六进制转换为字符串