3

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);

パラメータ付きクエリの実行計画 (linq to sql) 既知の値を使用したクエリの実行計画

編集:スクリーンショットはここでは少し小さくなりました. パラメータ化された SQL には 5 つのパラメータしかありません。

編集 2:実行計画を変更するのは、パラメーター @p0 を持つ Inner Join ステートメントです。値自体を含む @p0 変数のみを削除すると、1 秒以内に実行されます。この値がすべての場合で一定である場合 (調査する必要があります)、この値がパラメーターのように使用されないようにすることはできますか?

4

2 に答える 2

0

このステートメントを回避する方法を見つけました。これにより、実行時間が大幅に長くなります。

on (word.SearchID + 100000000) equals searchEntry.EventId

私がしたことは、計算列[SearchIdUnique] AS ([SearchID]+(100000000)) を追加することでした。次に、Linq クエリを次のように変更できます。

on word.SearchIdUnique equals searchEntry.EventId

クエリの実行は 1 秒未満に短縮され、問題は解決されました。

于 2013-11-04T14:06:13.113 に答える
0

クエリ プランの上に緑色のインデックスを作成することをお勧めします。まずこれを試してください。

于 2013-11-04T09:36:19.000 に答える