我需要简化一个复杂的sql语句,我已经走了很长的路,现在我想删除一个对我来说似乎多余的条件:确保已经有值的行不会更新。
问题:一般来说,两个更新状态中的一个会比另一个快吗?
选项1 :(更简单)
UPDATE example_table SET example_column = 0
WHERE some_conditions
选项2 :(附加条件不更新已经为0的元素)
UPDATE example_table SET example_column = 0
WHERE some_conditions AND example_column <> 0
Subquestion :如果选项2,为什么数据库优化无法检测到这个?
答案 0 :(得分:1)
选项2至少与选项1一样快。根据数据库的配置方式,选项2可能更快,尤其是当零行数代表匹配{{1}的行的重要部分时},并且您的数据库使用some_condition
上的昂贵逻辑定义更新触发器。
优化器无法将选项1优化为选项2的原因是它们的语义不相同。虽然这两个选项最终都使RDBMS处于相同状态,但必须将所有更新报告给RDBMS触发器。对于选项1,这包括琐碎的更新,这些更新被排除在选项2之外。