2016-04-15 16 views
0

私は.NETで複雑なクエリを持っています。 (出産の名前と日付)パラメータ化クエリが遅すぎる

テーブルがインデックス化され
SELECT * FROM Person WHERE [email protected] AND [email protected] 

SELECT * FROM Person WHERE Name='Ian' AND DateOfBirth='1961-04-04' 

と、この:以下のクエリ(説明のための単純なクエリ)を参照してください。

最初のクエリは.NETから実行するのにほんの1秒しかかかりません。 2番目のクエリには約48秒かかります。これは実行計画と関係がありますか? SQL Serverに実行計画を再作成させるために何かできることはありますか?

私はこの質問を見ました:https://dba.stackexchange.com/questions/530/how-do-you-clear-out-all-old-query-plans-from-within-microsoft-sql-server。ただし、これはストアドプロシージャの方が多くなります。

+0

実際のコードや問題を再現できるコードを表示していないときに、私たちが正確に問題を診断することを期待しているかどうかはわかりません。 – Becuzz

+0

@Becuzz、Gordon Lindoffは問題を正確に診断できました。 – w0051977

答えて

5

最初に、複合インデックスをPerson(Name, DateOfBirth)にする必要があります.2つのインデックスではありません(どちらの順番でもかまいません)。

第2に、これはおそらく実行計画と関係があります。

私はRECOMPILEオプションを提案するつもりです:

SELECT p.* 
FROM Person p 
WHERE Name = @Ian AND DateOfBirth = @DateOfBirth 
OPTION (RECOMPILE); 

何パラメータ化クエリで発生することができますことは、実行計画は、それが実行された最初の時間にキャッシュされていることである - しかし、その実行計画が最善ではないかもしれません後続の呼び出しのために。

これで問題が解決しない場合は、データ型の非互換性によってインデックスの使用が妨げられる可能性があるため、問題がデータ型になる可能性があります。データタイプの照合が同じであることを確認してください。適切なタイプのパラメータをcast()に設定するか、またはCOLLATEを使用する必要があります。

+0

すぐにお返事ありがとうございます。それは働いています。私はそれが私にできるようになると答えをマークします。 +1。 – w0051977

+0

おそらくどちらの順序でもインデックスを望んでいないでしょう。最も選択的なインデックスを最初に置く。 –

関連する問題