update
テーブルaの各行に対してサブクエリが実行されているため、以下を最適化するにはどうすればよいですか?
update
a
set
col = 1
where
col_foreign_id not in (select col_foreign_id in b)
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
。
これによりクエリが高速になるとは言えませんが、ここにいくつかの良い情報があります。ご使用の環境でテストする必要があります。
これは、in、exists、および外部結合の違いを明らかにするSQL Fiddleです(返された行、null処理、および実行プランを確認してください)。