0

@myInputParameter以下の最初の呼び出しは、5000 未満 かどうかを確認するためにこのチェックを 1 回だけ行うため、より効率的であると想定していました。

チェックが失敗した場合、クエリを完全に回避します。しかし、他の人が 2 番目の例のようなコードを書いているのを見たことがあります。

どちらが速いか誰か教えてください。特に呼び出しが大規模なデータ セットをくまなく調べている場合は、2 番目の呼び出しの方がはるかに遅くなるようです。

最初の呼び出し:

IF (@myInputParameter < 5000)
    BEGIN
        SELECT 
            @myCount = COUNT(1) 
        FROM myTable 
        WHERE someColumn=@someInputParameter
            AND someOtherColumn='Hello'

        --and so on
    END

2 回目の呼び出し:

SELECT 
    @myCount = COUNT(1) 
FROM myTable 
WHERE someColumn=@someInputParameter
    AND someOtherColumn='Hello'
    AND @myInputParameter < 5000

--and so on

編集: SQL Server 2008 R2 を使用していますが、どのクエリが SQL の「ベスト プラクティス」であるかを知りたいと思っています。これら 2 つのステートメントのクエリ時間の差は 1000 分の 1 秒であると確信しているため、それほど重要ではありません。一般的に、より良い SQL コードを書くことに興味があります。ありがとう

4

2 に答える 2

1

場合によっては、SQL Server が巧妙に後者を前者に変換することがあります。これは、フィルターやループ結合などの計画演算子の「開始述語」として現れます。これにより、クエリは短い一定時間で非常に迅速に評価されます。ところで、これをテストしました。

すべてのクエリでこれに頼ることはできませんが、テストを通じて特定のクエリで機能することを確認したら、それを信頼します。

このオプションを使用OPTION (recompile)すると、パラメーター値がクエリ プランにインライン化され、クエリ全体が一定のスキャンになるため、さらに信頼性が高くなります。

于 2012-11-30T20:35:44.903 に答える
0

SQL Server は適切に設計されています。必要がなければ、実際にテーブル/インデックスをスキャンせずにリテラル評価を行います。したがって、基本的に同じように機能すると思います。

練習の観点から、特に複数のステートメントをラップする場合は、if ステートメントを使用する必要があると思います。しかし、これは本当に私の好みの問題です。私にとって、実行できないコードは、実際にデータをヒットせずに実行する必要があるコードよりも論理的に高速です。

また、SQL Server が不適切な計画を作成し、実際にデータにヒットする可能性もあります。リテラルを使用したこの特定のシナリオは見たことがありませんが、不適切な実行計画が作成されたことがあります。

于 2012-11-30T20:38:18.033 に答える