2016-04-19 14 views
0

ここでクエリを理解するのが難しいです。 私のクエリは最終的に結果セットをレポートに返します。ここでは、パラメータでPersonを指定してデータを表示できます。 DimensionテーブルをEmployeeテーブルに追加して、EmployeeテーブルからNameを返します。これは、このWHERE句のパラメータを使用してクエリがハングアップする

Declare @PM varchar(30) 
Set @PM = 'John Smith' 

SELECT....FullName, EmployeeID, .... 
FROM... 
Inner Join EmployeesT on emp.EmployeeNumber = DimP.PersonID 
WHERE FullName in (@PM) 

ノートのようになります。私のEmployeeテーブルはnvarchar型であり、寸法がvarchar型であるが、私は参加するよう事項がまだ動作していることと思ういけません。

ここでは、テストのために上部にパラメータを設定しました。

ここに私の問題があります:WHERE節をWHERE DimP.PersonID IN ('12345')と言い換えると、3秒間実行されます。クエリをWHERE FullName in (@PM)に変更すると、クエリは永遠に実行されます。それはハングアップし、5つ以上のminuetsのために実行されます。誰も似たような問題を経験しましたか?

結果セットが複数の「人」との正しいデータを生成し、私は一人ではなく、IDを指定することでこれをテストしたいが、私は名前にパラメータを変更したときに、クエリがハングアップ..

+0

パフォーマンスの問題は、テーブルの構造とインデックスに関連しています。また、1つの名前を渡すだけの場合、なぜ単に "WHERE FullName = @ PM"を入れないのですか? – momar

+0

私はこれを試して、同じ問題がありました。以下のCASE文を追加して解決しました。 – Geo

+0

何も返されないようにcaseステートメントが正しいかどうかわからない。おそらく質問に完全な質問を投稿するべきです。また、パフォーマンスの問題は、実行計画が悪いために発生する可能性があります。ここでの議論を参照してください:https://www.brentozar.com/archive/2014/06/tuning-stored-procedures-local-variables-problems/ – momar

答えて

0

マイ同僚は、この問題を解決することができた:彼女は `WHERE emp.empNumberは=(emp.FullName IN(@PM)CASE)

を使用:)

+2

これは、彼女が使用した正確な構文は、あなたが望む結果が得られない限り、それを追加しますか?減速の潜在的な理由について[このブログ](http://www.sqldoubleg.com/2016/03/03/fast-with-values-slow-with-variables/)の記事をチェックしてください。 – Shaneis

+0

@Shaneisクエリは5秒未満で実行されていたはずです。 IN PMまたはemp.empNumber = PMを使用するとハングアップし、5分以上かかる。このケースステートメントを使用すると、問題が解決されたようです。 – Geo

+0

実行に5分以上かかる問題を解決しますか?私が最後にチェックしたときに間違いがないと、エラーは直ちに返されます。 タイミングの問題が解決したら、それは素晴らしいことです! しかし完全なCASE構文は、あなたがそこに持っていたものではありませんでした。他のいくつかの 'AND'がどのように見えるの後when_expression THEN [... n]は [ELSE else_result_expression] END' – Shaneis

0

それはパラメータスニッフィングかもしれません。別のパラメータ値の最適化された実行計画にぶら下がっています。 クエリの最後にOPTION(OPTIMIZE FOR(@parm UNKNOWN))を使用してみてください。

Declare @PM varchar(30) 
Set @PM = 'John Smith' 

SELECT....FullName, EmployeeID, .... 
FROM... 
Inner Join EmployeesT on emp.EmployeeNumber = DimP.PersonID 
WHERE FullName in (@PM) 

OPTION (OPTIMIZE FOR (@PM UNKNOWN)) 
関連する問題