最近、SQL Server2008に対するEntityFrameworkクエリでパフォーマンスの問題が発生しました。問題を修正できましたが、修正が機能した理由がわかりません。.Contains()メソッドを使用してGuidのコレクションを使用して、SQLでIN句を生成しています。元のコードは次のとおりです(無実を保護するためにテーブル名が変更されています)。
Guid[] values = filter.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();
returnValue = returnValue.Where(t => values.Contains(t.WorkItem.Requirement.Project.ProjectId));
ProjectIDが150を超える場合、このクエリの実行には最大20秒かかります。.Contains()の場所を変更することで、処理を大幅に高速化できます。リファクタリングは次のとおりです。
Guid[] values = filter.FilterValue.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();
var projects = from p in context.DC_DEF_Project
where values.Contains(p.ProjectId)
select p;
returnValue = from t in returnValue
join p in projects on t.DC_DEF_ProjectWorkItem.DC_DEF_ProjectRequirement.ProjectId equals p.ProjectId
select t;
このコードは、上記のクエリと同じデータセットで約0.125秒かかります。
これには確かな理由があると思いますが、私の好奇心は私を殺しています。それは何ですか?