2017-10-20 12 views
0

パラメータチェックに基づいて実際に時間がかかる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秒未満で完了します。

私はそれを回避することができますが、ここで何が起こっているのかを知りたかったのです...?

+0

これはほとんど間違いなくパラメータスニッフィングの問題です。簡単な解決策は、単にストアドプロシージャに 'WITH RECOMPILE'を追加することです。私はあなたが一般的にパラメータスニッフィングに関するいくつかの研究を行うことをお勧めします、ちょうどあなたが行っていることを理解して –

+0

@ Nick.McDermaid大丈夫は考えていませんでした。私はこれまでにこの問題を抱えていました。しかし、私はそれだけで分離されたクエリウィンドウでクエリをテストすると、同じ問題が発生していますか?これでパラメータスニッフィングの問題から除外されますか? –

+0

いいえ。クライアントアプリケーション(SSMSまたはWebアプリケーション)でパラメータスニッフィングが発生する可能性があります。 –

答えて

0

私は、この製剤を提案することがあります

select o.id, o.createdBy 
into #results 
from jmsTransOther o 
where o.WorkOrderId IN (SELECT intValue FROM dbo.fn_SplitInts(@WorkOrderIds, ',')) 
union all 
select o.id, o.createdBy 
from jmsTransOther o 
where @WorkOrderIds = ''; 

orは、おそらく統計をめちゃくちゃにされています。 (私は空の文字列ではなく、 "すべて"を意味するためにNULLを使用します)。

+0

残念なことに、私は、この解決策がかなり乱雑になることを意味するwhere条件の異なる基準のためのこれらの同じパラメータチェックの約6を持っています... –

+0

@GlenHong。 。 。あなたが求める質問に答えることは可能です。別の質問がある場合は、*新しい*質問としてそれを尋ねます。この質問を編集するのは、この答えを無効にするサーバーだけです。 –

+0

最後の行に質問があります...私はそれを回避することができますので、私は本当に解決策を探していませんでした。ニックマーメイドは、彼が問題だと思っていることを指摘しているので、私は問題を引き起こしていたものについていくつかの洞察をもっと探していました。 –

関連する問題