1
してグループを追加した後、私は非常に高速に実行次のクエリを持っている:私は文を次のようにgroup by
と変更クエリを追加する場合Entity Frameworkの - スロークエリ
var query =
(from art in ctx.Articles
join phot in ctx.ArticlePhotos on art.Id equals phot.ArticleId
join artCat in ctx.ArticleCategories on art.Id equals artCat.ArticleId
join cat in ctx.Categories on artCat.CategoryId equals cat.Id
where art.Active && art.ArticleCategories.Any(c => c.Category.MaterializedPath.StartsWith(categoryPath))
orderby art.PublishDate descending
select new ArticleSmallResponse
{
Id = art.Id,
Title = art.Title,
Active = art.Active,
PublishDate = art.PublishDate ?? art.CreateDate,
MainImage = phot.RelativePath,
RootCategory = art.Category.Name,
Summary = art.Summary
})
.AsNoTracking().Take(request.Take);
はしかし、それははるかにはるかに遅い実行されます。
var query =
(from art in ctx.Articles
join phot in ctx.ArticlePhotos on art.Id equals phot.ArticleId
join artCat in ctx.ArticleCategories on art.Id equals artCat.ArticleId
join cat in ctx.Categories on artCat.CategoryId equals cat.Id
where art.Active && art.ArticleCategories.Any(c => c.Category.MaterializedPath.StartsWith(categoryPath))
orderby art.PublishDate descending
select new ArticleSmallResponse
{
Id = art.Id,
Title = art.Title,
Active = art.Active,
PublishDate = art.PublishDate ?? art.CreateDate,
MainImage = phot.RelativePath,
RootCategory = art.Category.Name,
Summary = art.Summary
})
.GroupBy(m => m.Id)
.Select(m => m.FirstOrDefault())
.AsNoTracking().Take(request.Take);
各カテゴリで9回ホームページが呼び出されます。最初のバージョンのクエリでは、キャッシュをオンにせずにSQLにリモートで接続すると、ページの読み込みは約1.5秒になります。これは、アプリケーションがサーバー上にあるときにほとんど瞬時になりますが、2番目の方法では、SQLがリモートの場合、
クエリ全体をビューまたはストアドプロシージャに書き換えることなく修正できますか?
私はそのアイデアも持っていましたが、ページネーションをスキップ/取るのは正しいとは思いませんか? – Robert
@Robertこの場合、SQLプロファイラを立ち上げ、sql Entity Frameworkが生成しているものを確認する必要があります。次に、そのSQLをSSMSで実行して、実行計画を確認します。それはパフォーマンスのボトルネックが何であるかを示します。 – AngryHacker
リレーショナルテーブルに正しいインデックスを追加すると、すべてがスピードライトになりました。 – Robert