2012-04-02 14 views
5

を使用しています。なぜSQL Serverは、私は例のクエリを持っているネステッド・ループ

しかし、User.PlanId = 2のSQLマネージャでは、クエリにネストされたループを使用すると、非常に遅いです...異なる検索基準を使用すると、別のアルゴリズムが使用されるのはなぜですか?どうすれば修正できますか?

+2

テーブルの行数、PlanId = 1、PlanId = 2の行数 –

+0

'Country.Id'はプライマリキーか少なくとも一意ですか?うーん..時には回避策は、 'left join' +条件の追加とuser.countryidがnullではないことがあります。 – Aprillion

+0

私はplanId = 1を約2500行、planId =約280行持っています。そしてCountry.Id = User.CountryIdには1対1の関係があります – Reno

答えて

3

私はあなたが1

と比べ2のPlanIDを持つユーザーのはるかに高い数値を持っていること。これは、execの計画の変更とランタイムの両方を説明します推測するつもりです。 HASH MATCHは、最も汎用性の高い(一般的には効率の低い)結合です。基本的に、エンジンはすべての値を手動でペア設定するテーブルを作成します。

NESTED LOOPは、左側の各値を右側の値と照合し、一方のデータセットが他方よりも大きく、両側がインデックスされている場合にうまく機能します。

HASH MATCHは、実際に小さなデータセットを使用するとすばやくできます。データセットのサイズが異なるため、速度の違いがあると思われます。

SELECT PlanId, COUNT(*) as CT 
FROM User 
GROUP BY PlanID 

...これはあなたの流通を提供します。

関連する問題