2

ASP.NET MVC アクション メソッドで次の簡単なクエリがあります。

IEnumerable<Company> query = unitOfWork.CompanyRepository.dbSet
    .Include("Adresses.PhoneNumbers")
    .Include("Adresses.FaxNumber")
    .Include("Emails").Where(q => q.CustomerCompany == true);

このアクション メソッドは ajax get リクエストを介して呼び出され、最大 25 秒かかる場合があります。データベース内のわずか 40 社の企業に対して。それぞれに 1 つの住所と、多くても 2 つの電話番号とファックス番号があります。(興味深いことに、200 ~ 500 ミリ秒かかることもありますが、非常にまれです)。

このクエリを次のように変更すると

IEnumerable<Company> query = unitOfWork.CompanyRepository.dbSet
    .Where(q => q.CustomerCompany == true);

約 200 ミリ秒しかかかりません。

では、なぜ.Includeそんなに高価なのか不思議です。私のアプリケーションは運用中で、Azure Web サイトで SQL Azure を使用しています。

ありがとう。

4

1 に答える 1

2

生成される SQL はより複雑ですが、通常、パフォーマンスは LINQ クエリのコンパイル オーバーヘッドによるものです。確実にプロファイリングする必要があります。考えられる修正の 1 つは、プリコンパイル済みクエリを使用することです。これにより、2 回目以降は高速になります。より適切な修正は、クエリに 4 つのエンティティを含める代わりに、必要なデータのみの射影を使用することですSELECT *。これらの完全なエンティティのすべてが必要な場合の別の可能な修正は、詳細を明示的にロードすることです。これは、より多くの (ただしより高速な) クエリを意味します。

于 2012-10-12T21:26:14.447 に答える