パラメータチェックに基づいて実際に時間がかかるSQLクエリがあります....パラメータチェックでSQLクエリに時間がかかります
クエリ自体は検索に使用するストアドプロシージャの一部です画面。基本的には、検索するテキスト/コンボボックスがたくさんあるフォームに記入してください。私は区切られたフィールドの方法で同じフィールドの複数の値を通過する複数選択コンボボックスを持っています。
次は、私はかなり頻繁に基本的にはこれが本当でない場合は、その後の他の側面を行う意味は、このパラメータのチェックOR @WorkOrderIds = ''
を使用
select
o.id,
o.createdBy
into
#results
from
jmsTransOther o
where
o.(WorkOrderId IN (SELECT intValue FROM dbo.fn_SplitInts(@WorkOrderIds, ',')) <strong>OR @WorkOrderIds = ''</strong>)
...私の問題を説明するために、クエリの伐採バージョンですその声明
これは、基本的には区切りリストをテーブルに変換してから、 "IN"ステートメントを実行することは本当に長い時間がかかるこのfn_SplitInts
関数で何らかの理由で非常にうまく動作します。
この表には約200,000のレコードがあります。現在、検索には約40秒かかります。ただし、パラメータチェック、つまりOR @WorkOrderIds = ''
を削除すると、1秒未満で完了します。
私はそれを回避することができますが、ここで何が起こっているのかを知りたかったのです...?
これはほとんど間違いなくパラメータスニッフィングの問題です。簡単な解決策は、単にストアドプロシージャに 'WITH RECOMPILE'を追加することです。私はあなたが一般的にパラメータスニッフィングに関するいくつかの研究を行うことをお勧めします、ちょうどあなたが行っていることを理解して –
@ Nick.McDermaid大丈夫は考えていませんでした。私はこれまでにこの問題を抱えていました。しかし、私はそれだけで分離されたクエリウィンドウでクエリをテストすると、同じ問題が発生していますか?これでパラメータスニッフィングの問題から除外されますか? –
いいえ。クライアントアプリケーション(SSMSまたはWebアプリケーション)でパラメータスニッフィングが発生する可能性があります。 –