2

重複の可能性:
SQL Server - クエリのショートサーキット?
SQL WHERE 句の短絡は評価されますか?

T-SQL (SQL Server 2005) での論理 OR 演算子のパフォーマンスについて質問があります。

少し調べてみましたが、この件に関するものは見つかりませんでした。

次のクエリがある場合:

SELECT * FROM Table WHERE (randomboolean OR HeavyToEvaluateCondition)

randomboolean最初の条件が真である場合、プロシージャーインタープリターは、パフォーマンスを節約するために、重い条件の評価をスキップすることはありませんか?

OR ステートメントの値の 1 つが真であるため、最初の条件が満たされていることが既にわかっているため、2 番目の条件を評価する必要はありません。

C# でこのように動作することはわかっていますが、T-SQL でも当てにできるかどうか知りたいです。

4

3 に答える 3

5

TSQLでは短絡評価を期待することはできません

オプティマイザーは、適切と思われる順序で条件を自由に評価でき、状況によっては、2番目の評価で式の結果を変更できない場合でも、式の両方の部分を評価する場合があります()。

ただし、短絡評価が行われないというわけではありません。高価な条件で起動述語を取得する可能性があるため、必要な場合にのみ実行されます。

さらに、ORクエリにが含まれていると、引数可能な検索条件が引数不可能な検索条件に変換される可能性があります。これは、インデックスが最適に使用されないことを意味します。特にSQLServer2005では(2008年にOPTION (RECOMPILE)はここで役立ちます)。

たとえば、次の計画を比較します。のバージョンはOR、特定の値へのインデックスシークではなく、完全なインデックススキャンを実行することになります。

DECLARE @number INT;
SET number  = 0;

SELECT COUNT(*)
FROM master..spt_values
WHERE @number IS NULL OR number = 0

SELECT COUNT(*)
FROM master..spt_values
WHERE  number = 0

プラン

于 2011-12-15T13:16:07.587 に答える
1

それは短絡と呼ばれます。そして、はい、SQLServerは特定の場合にそれを行います。どの順序で多くの要因に依存し、実行計画の最適化の一部を形成します。

ただし、これはJOIN条件、CASEステートメントなどに限定されるという詳細がオンラインにあります。

このSOの投稿を参照してください... SQLServer-クエリの短絡?

于 2011-12-15T13:15:42.323 に答える
-4

最初に条件が実行される場所では、制御が最初の条件に移動したときに OR 演算子が実行されます。最初の条件が true の場合は、2 番目の条件をチェックしません。100 条件が与えられ、このシナリオで最初の条件が false の場合、次の条件をチェックします.

于 2011-12-15T13:20:40.903 に答える