如何优化以下update
,因为正在为表a中的每一行执行子查询?
update
a
set
col = 1
where
col_foreign_id not in (select col_foreign_id in b)
答案 0 :(得分:2)
您可以使用没有匹配记录的外部联接,而不是not in
:
update table1 a
left join table2 b on a.col_foreign_id = b.col_foreign_id
set a.col = 1
where b.col_foreign_id is null
这应该使用简单的选择类型而不是依赖子查询。
您当前的查询(或者自OP中的示例以来实际工作的查询看起来不像它)是有潜在危险的,因为b.col_foreign_id中的NULL将导致无法匹配,并且您不会更新否行。
如果您想要替换not exists
,还可以查看 not in
。
我不能告诉你这会让你的查询更快,但有一些好的信息here。你必须在你的环境中进行测试。
这是一个SQL Fiddle,它阐明了in,exists和outer join之间的区别(检查返回的行,null处理和执行计划)。