2009-07-13 10 views
6

T-SQLでは何が速いのですか?私の場合XにINまたはORの方が速いのは何ですか?

DELETE * FROM ... WHERE A IN (x,y,z) 

または

DELETE * FROM ... WHERE A = x OR A = y OR A = z 

、yおよびzは、ストアドプロシージャの入力パラメータです。そして私は自分の能力の中でDELETEとINSERT文のパフォーマンスを得ようとしています。

答えて

11

"IN"は一連の "OR"に変換されます。 "IN"を含むクエリの実行計画を見ると、展開されていることがわかります。

私の意見では、特に大規模なクエリでは "IN"を使用するほうがはるかに読みやすくなります。

+0

実行計画では、CPU時間がまったく同じであることがわかりました。 – Zyphrax

+0

これは当てはまりません。 Inはorsのseriseとして翻訳されていません。あなたはあなたのクエリをプロファイルし、結果を実際に見るのが最善でしょう。多くの場合、EXISTSはINより高速です。しかし、OR *は両方より速いはずです。しかしそれはインデックスにも依存します。 –

+0

@Frank、私たちは値リストを持つINについて話していますが、サブクエリを持つINは話していません。 –

0

正確には等しくなければなりません。ほとんどのRDMBS transalte INORs。もちろん

あなたはINsからORsへの翻訳が高く、時間がかかることを考慮すれば、ORsとの文章が速く;-)

アップデートです:私はAが列であることを検討しています。

1

Aが計算の場合、INを使用して1回実行し、ORを使用してN回行います。

14

考えていません。プロフィール。

スピードの問題を考えるときは、直感、あなた、または他の人に頼らないことを強くお勧めします。代わりに、いくつかの種類のプロファイリング/ランタイム測定を使用して、両方のオプションを試してください。があなたの状況ではより高速です。

+1

+1私は自分自身を言おうとしていることをバックアップしていただきありがとうございます。 :-) –

4

INを使用し、もう1つはORを使用して2つのストアドプロシージャをテストサーバーに書き込みます。各手順を10,000(または1,000,000、または何でも)回実行し、タイミングを比較します。

一般的に、これは、どちらのアプローチがより高速であるかという質問に対して良い答えを得るための「唯一の」方法です。単純なタイミングテストケースを作成し、何度も何度も実行します。

3

SQL Serverでは、オプティマイザはこれらのクエリに対して同じ計画を生成します。

1

かかわらず、Aが計算または列であるかどうかの計画を見てみましょう私の経験から、同じ正確な計画を生成する必要がありますが、2005年にOR句で変換SQL Serverのように見えます。

+0

あなたのINの内容が別のSELECTステートメントの結果である場合、それを結合に変換することもできます。 –

1

SQL Serverの中で最も速いのは、INNER JOINでDELETEを使用することです。 3つの値を指定すると違いはわかりませんが、より多くの値(数千を実行しています)では違いが表現力です。あなたは一時テーブルにあなたの価値を隠し、それに加わることができます。

など。

DELETE C 
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID 

オプションのwhere句を追加することもできます。

関連する問題