如果从更新中排除 0 值,更新语句到 0 通常会更快吗?

Will an update statement to 0 be generally faster if 0 values are excluded from the update?

我需要简化一个复杂的 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

子问题:如果选项 2,为什么数据库优化无法检测到这一点?

选项 2 至少与选项 1 一样快。根据数据库的配置方式,选项 2 可能更快,尤其是当具有零的行数代表匹配行的很大一部分时 some_condition,并且您的数据库在 example_table.

上定义了具有昂贵逻辑的更新触发器

优化器无法将选项 1 优化为选项 2 的原因是它们的语义不相同。尽管这两种选择最终都使 RDBMS 处于相同状态,但所有更新都必须报告给 RDBMS 触发器。对于选项 1,这包括琐碎的更新,选项 2 不包括这些更新。