システム:SQL Server 2008-R2SQL OR演算子の評価方法
私はその列の1つが "レベル"という名前のテーブルを持っています。 レベルは負数ではありません。
私は:
SELECT XXXXX
FROM YYYYY
WHERE (------------) AND
(Level >= @MinLevel) AND
(------------)
私は正しい応答を取得します。
クエリを最適化するための試みで、私が実行しようとしました:
SELECT XXXXX
FROM YYYYY
WHERE (------------) AND
((@MinLevel = 0) OR (Level >= @MinLevel)) AND
(------------)
要求された最小レベルが0の場合は、クエリに最小 レベルの制限を追加し、そのことにより、保存する必要はありませんが(レベルにインデックスがないと仮定して)
実際には、「最適化されていない」クエリよりも長いクエリまたは少なくとも短いクエリではありません。
誰でも理由を説明できますか?
'OPTION(RECOMPILE)を追加してみてください。違いはありますか? '@ MinLevel'もローカル変数またはパラメータですか? –
おそらく、dbmsからクエリを最適化する作業をして、あなた自身でそれをやったからです。ほとんどの場合、dbmsはよく分かります。 – Femaref
長い/短いクエリはどういう意味ですか?より長い実行時間またはより複雑な[実行計画](http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx)? '@MinLevel = 0'は大規模なデータセットを返さなければならないので、両方のクエリで同じ時間がかかると思うし、そのような単純な比較は通常非常に高速でほとんど気づかれないことがあります。ところで、あなたが必要とする最適化の種類は、[あなたの 'Level'カラムをインデックス化することです(http://msdn.microsoft.com/en-us/library/ms188783.aspx)です。 – Trinidad