2016-05-12 6 views
0

どのステートメントが優れていますか?どのSQL文が良いですか?

Update tableA set field1 = @AAA 
where fieldB = 12345 
and fieldC = 'Ask' 
and fieldA <> @AAA 

それとも

Update tableA set field1 = @AAA 
where fieldB = 12345 
and fieldC = 'Ask' 

未満5行が条件に一致するのみと仮定し、それはFIELDA <> @AAAを追加するために冗長ですか?検索が遅くなる可能性がありますが、更新する必要のないレコードは除外されます。だから私はいつもこの条件を追加すべきかどうかわかりません。

+0

もちろん、結果が同じであっても、より少ない行を更新するほうがよいでしょう(可能なトリガーf.eを考慮してください)。 –

答えて

0

2つは同じではありません。正しい最初のクエリは、NULLを考慮する必要があります。これは、それが聞こえる以上に厄介です:

Update tableA 
    set field1 = @AAA 
    where fieldB = 12345 and 
      fieldC = 'Ask' and 
      (fieldA <> @AAA or fieldA is null and @AAA is not null or 
      fieldA is not null and @AAA is null 
     ); 

をコメントにし、他の回答で述べたように、行の数を制限すること、クエリが良好に動作するという意味で「より良い」です。これは、具体的には、(fieldB, fieldC, fieldA)のように3つの列のインデックスがある場合に当てはまります。その後、エンジンはインデックスを使用して更新する行を決定することができます。おそらく、一連の行を読み込むことで節約できます。

注:データベースは、値が同じ場合に「実際に」更新が行われるかどうかが異なります。つまり、更新がログに記録されるか、トリガーがアクティブにされるかどうかです。

+0

ええ、あなたは正しいです、私はnull値を考慮する必要があります。ただし、「アップデートがログに記録されるかどうか、トリガーがアクティブになっているかどうか」について詳しく説明できますか?私はそれをうまくつかない。 – invicil

+0

このような詳細はデータベースによって異なります。 –

0

最小レコードを更新し、このクエリから不要な行が更新されないため、最初のクエリを使用する必要があります。

関連する問題