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

これによりクエリが高速になるとは言えませんが、ここにいくつかの良い情報があります。ご使用の環境でテストする必要があります。

これは、in、exists、および外部結合の違いを明らかにするSQL Fiddleです(返された行、null処理、および実行プランを確認してください)。

于 2013-02-19T18:03:18.493 に答える