1

ハードコーディングされた 1=0 および 1=1 値を使用してクエリをテストします。それらを変数に置き換えると、クエリの速度が大幅に低下します。そして提案?

DECLARE @BoxType int
SET @BoxType = 2

Select blah from table t
INNER JOIN table2 t2
    ON (t2.blah = t.blah AND 1=1 OR t2.blah = t.blah AND 1=0)

- とても早い

次を使用して書き直します。

...
INNER JOIN table t
    ON (t2.blah = t.blah AND @BoxType = 2 OR t2.blah = t.blah AND @BoxType = 1)

- 非常に遅い

4

2 に答える 2

3

t2.blah = t.blah AND 1=0常に false になるため、コンパイル時に最適化できます。

@BoxType <> 1SQL Server 2008+ を使用しているときに 2 番目のクエリが遅いと言っている場合はOPTION (RECOMPILE)、クエリに追加して、変数の実際の値に応じて同じコンパイル時間の単純化を得ることができます。

于 2013-09-20T16:27:55.217 に答える
1

コメントはこれにちょっと触れました。「Where MyField = 1」と言うと、DB はどの行が見つかるかわからないため、実際にそれらを検索する必要があります。フィールドにインデックスがある場合、かなり高速になる可能性があります。インデックスがなく、テーブルをスキャンする必要がある場合、非常に長くなる可能性があります。

しかし、「Where 1 = 0」と言うと、データベースは、条件が常に false であり、レコードが見つからないことをステートメントから認識します。そのため、テーブルを読み取る必要さえないため、すぐに目がくらむようになります。空の結果セット

于 2013-09-20T16:31:44.340 に答える