パラメータをハード値に置き換えることで、SQL Server クエリのパフォーマンスが大幅に向上するという問題が発生しています。例えば:
SELECT * FROM Table1 WHERE RowNumber >= 101 AND ID < 200
次のものよりも大幅に高速です。
DECLARE @Start int = 101;
DECLARE @End Start int = 200;
SELECT * FROM Table1 WHERE RowNumber >= @Start AND RowNumber < @End
最初のものは約 2 秒で実行され、2 番目のものは 15 秒で実行されます。私の質問は、ハード値が数値であり、文字列のみをパラメータ化する場合、ハード値を使用しても安全ですか? RowNumber 列は既に非クラスター化インデックスとしてインデックス化されているため、これはインデックスの問題ではないと思います。私はすべての SQL インジェクション手法に精通しているわけではありませんが、SQL インジェクション攻撃を回避するために、何年もの間、すべての入力値にパラメーターを使用してきました。パラメータを使用することで、このようなパフォーマンスが低下する可能性があることにまったく気づきませんでした。
パラメータを使用したパフォーマンスの低下に関する SO に関する質問もいくつか見ましたが、問題の解決方法に関する決定的な回答は見当たりませんでした。