29

Sql Server 2005 では、複数のパラメーターがある場合、評価順序が常に左から右になるという保証はありますか?

例を使用します。

select a from table where c=1 and d=2

このクエリで、「c=1」条件が失敗した場合、「d=2」条件は評価されませんか?

PS-「c」は整数のインデックス付き列であり、d は大きな varchar であり、完全なテーブル スキャンを必要とするインデックス付けできない列です。

更新2 つのクエリまたは条件ステートメントの実行を回避しようとしていましたが、次のようなものが必要です。「c 条件」が失敗した場合、重い「d 条件」の実行を回避する方法があります。私の場合は必要ないからです。

4

7 に答える 7

32

評価順序の保証はありません。オプティマイザは、利用可能な情報を使用して、クエリを実行する最も効率的な方法を見つけようとします。

あなたの場合、c はインデックス付けされていて、d はインデックス付けされていないため、オプティマイザはインデックスを調べて c の述語に一致するすべての行を検索し、テーブル データからそれらの行を取得して d の述語を評価する必要があります。

ただし、 c のインデックスがあまり選択的ではないと判断した場合 (あなたの例ではありませんが、性別列が有用にインデックス化されることはめったにありません)、とにかくテーブルスキャンを実行することを決定する場合があります。

実行順序を決定するには、クエリの説明計画を取得する必要があります。ただし、その計画は、オプティマイザーが現時点で最適なクエリと判断する内容に応じて変更される可能性があることに注意してください。

于 2009-01-27T16:43:50.407 に答える
4

SQL Server は、実行するステートメントごとに最適化されたプランを生成します。その利点を得るために where 句を注文する必要はありません。あなたが持っている唯一の保証は、ステートメントを順番に実行することです。

SELECT A FROM B WHERE C
SELECT D FROM E WHERE F

2 番目の行の前に最初の行を実行します。

于 2009-01-27T16:41:42.983 に答える
3

評価順序を制御する 1 つの方法は、CASE 式を使用することです。

[編集]

私が表現しようとしていた一般的な意見は次のとおりです。

オプティマイザーは、最初の述語の前に 2 番目の述語を評価する計画を選択する可能性があるため、「WHERE OR」などの式の評価順序に依存することはできません。ただし、CASE ステートメント内の式の評価の順序は固定されているため、CASE ステートメントの決定論的短絡評価に依存できます。

以下のサイトで説明されているように、それよりも少し複雑になります。

http://blogs.msdn.com/b/bartd/archive/2011/03/03/don-t-depend-on-expression-short-circuiting-in-t-sql-not-even-with-case. aspx

于 2009-01-27T16:51:57.473 に答える
2

ショートサーキットは、参照している条件にリテラルまたは定数のみが含まれている場合に実行されます。たとえば、1 から 10 までのすべての正の数を持つ列 num を持つテーブル TableA があるとします。次に、このクエリを作成するとします。

TableA WHERE TableA.num < 0 AND 1/0 = 10 から num を選択します。

エラーになります。

コンパイラは、テーブルまたはインデックスからのスキャンを必要とする句を評価する前に、2 番目の句が定数で構成されていることを判断するのに十分スマートですか?

于 2009-11-04T06:46:38.803 に答える
2

クエリの実行計画を見て、実際に何をしようとしているのかを判断できます。SQL Server のクエリ エンジンは、この種のスキャンを実行することになっていて、それをインテリジェントに操作に変換すると思います。同様に、「expensive-op AND false」を実行すると、すぐに false と評価されます。

私が学んだことから、入力したものは実際に実行されたものとは異なります (そして異なる可能性があります)。期待する結果のタイプをサーバーに伝えているだけです。答えを得る方法は、提供するコードの左から右に相関しません。

于 2009-01-27T16:43:23.200 に答える
2

確認したい場合は、Query Execution Planを確認してください。MSSQL が構築/最適化する実行プランは、varchar 列の前にインデックス付き列をチェックするほどスマートです。

于 2009-01-27T16:52:16.520 に答える
1

MS SQL Server クエリ オプティマイザーはショート サーキットを行います。保証します。

これを実行します:

select 1 where 1 = 0 and 1 / 0 = 10

クエリオプティマイザが where 句を短絡評価するため、ゼロで除算していても、問題なく実行され、エラーにはなりません。これは、「and」を使用し、and の部分の 1 つが定数である where 句に影響します。

于 2009-01-27T16:53:11.043 に答える