T-SQLでは何が速いのですか?
DELETE * FROM ... WHERE A IN (x,y,z)
または
DELETE * FROM ... WHERE A = x OR A = y OR A = z
私の場合、x、y、zはストアドプロシージャの入力パラメータです。そして、DELETEステートメントとINSERTステートメントのパフォーマンスを最大限に発揮させようとしています。
T-SQLでは何が速いのですか?
DELETE * FROM ... WHERE A IN (x,y,z)
または
DELETE * FROM ... WHERE A = x OR A = y OR A = z
私の場合、x、y、zはストアドプロシージャの入力パラメータです。そして、DELETEステートメントとINSERTステートメントのパフォーマンスを最大限に発揮させようとしています。
考えないでください。プロフィール。
スピードの問題を考えるときは、あなたの直感や他の誰かの直感に頼らないことを強くお勧めします。代わりに、何らかのプロファイリング/実行時間測定を使用して両方のオプションを試し、状況に応じてどちらが速いかを見つけてください。
「IN」は一連の「OR」に変換されます...「IN」を含むクエリの実行計画を見ると、それが展開されていることがわかります。
私の意見では、「IN」を使用する方がはるかにクリーンです。特に大きなクエリでは、はるかに読みやすくなります。
テスト サーバーで2 つのストアド プロシージャを記述します。1 つは を使用しIN
、もう1 つは を使用します。OR
各手順を 10,000 回 (または 1,000,000 回など) 実行し、タイミングを比較します。
一般に、これはどちらのアプローチが速いかという質問に対する適切な答えを得る「唯一の」方法です。単純なタイミング テスト ケースを記述し、何度も何度も実行します。
ではSQL Server
、オプティマイザはこれらのクエリに対して同一のプランを生成します。
彼らは私の経験から同じ正確な計画を生成する必要があります
計画を見てみましょう
A
が計算の場合、 を使用して 1 回、 を使用IN
して N 回実行されOR
ます。
A が計算または列であるかどうかに関係なく、SQL Server 2005 は IN を OR 句に変換するように見えます。
SQL Server で最も高速なのは、INNER JOIN で DELETE を使用することです。値が 3 つの場合は違いに気づきませんが、より多くの値を使用すると (数千を実行しています)、その違いは驚異的です。値を一時テーブルに隠してから、それに参加できます。
例えば
DELETE C
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID
オプションの where 句を追加することもできます。
正確に等しくなければなりません。RDMBSのほとんどはに変換IN
されORs
ます。
もちろん、INs
toORs
からの翻訳に時間がかかると考えると、withの文のORs
方が速くなります;-)
更新:私はそれA
がコラムだと考えています。