1

update由于正在为表 a 中的每一行执行子查询,我该如何优化以下内容?

update 
  a 
set 
  col = 1 
where 
  col_foreign_id not in (select col_foreign_id in b)
4

1 回答 1

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.

我不能告诉你这会让你的查询更快,但这里有一些很好的信息。您必须在您的环境中进行测试。

这是一个SQL Fiddle,阐明了 in、exists 和 external join 之间的区别(检查返回的行、null 处理和执行计划)。

于 2013-02-19T18:03:18.493 回答