MSSQL サーバー 2008 に対して実行に 11 分かかる linq クエリがあります。MSSQL プロファイラーを使用して、実行に時間がかかるクエリを見つけ、データベースに対して単独で実行しました。
また、すべてのパラメーターを削除し、値を直接追加して、クエリを実行しました。実行にかかった時間は 1 秒未満でした。
グーグルで検索したところ、where句の値が判明する前にプランがコンパイルされるため、パラメーターを使用するとパフォーマンスに実際に影響を与える可能性があることがわかりました。
Linq to SQL は常にパラメーター化された SQL を実行するため、この場合のパフォーマンスを向上させるにはどうすればよいでしょうか?
インデックスに関する列を改善できるものは見つかりませんでした。Inner Join ステートメントの最初のテーブルには 192,014 行があり、パラメーターのない SQL の実行には 1 秒もかかりません。実行計画のスクリーンショットが添付されています。
編集はスクリーンショットの下にあります。
これは Linq クエリです。
var criteria = CreateBaseCriteria();
var wordsGroup = from word in QueryExecutor.GetSearchWords()
join searchEntry in QueryExecutor.GetReportData(criteria) on (word.SearchID + 100000000) equals searchEntry.EventId
group searchEntry by word.SearchWord into wg
select new SearchAggregate
{
Value = wg.Key,
FirstTime = wg.Min(l => l.EventTime),
LastTime = wg.Max(l => l.EventTime),
AverageHits = wg.Average(l => l.NumberOfHits.HasValue ? l.NumberOfHits.Value : 0),
Count = wg.Count()
};
return wordsGroup.OrderByDescending(w => w.Count).Take(maxRows);
編集:スクリーンショットはここでは少し小さくなりました. パラメータ化された SQL には 5 つのパラメータしかありません。
編集 2:実行計画を変更するのは、パラメーター @p0 を持つ Inner Join ステートメントです。値自体を含む @p0 変数のみを削除すると、1 秒以内に実行されます。この値がすべての場合で一定である場合 (調査する必要があります)、この値がパラメーターのように使用されないようにすることはできますか?