如果从更新中排除 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 不包括这些更新。
我需要简化一个复杂的 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 不包括这些更新。