2

私のアプリケーションでは、SQLCE4.0とEntityFrameworkCodeFirstを使用しています。

public class Customer : IEntityPoco
{
    public  int Id { get; set; }

    public  string Sex          { get; set; }
    public  string Titel        { get; set; }
    public  string FirstName    { get; set; }
    public  string SecondName   { get; set; }
    public  string LastName     { get; set; }
    public  string Fax          { get; set; }
    public  string Notice       { get; set; }
    public  DateTime LastChange { get; set; }

    public  int AddressId   { get; set; }
    public  Address Address { get; set; }

    public  ICollection<Sale> Sales { get; set; }
    public  ICollection<Customer> Partner1 { get; set; }
    public  ICollection<Customer> Partner2 { get; set; }
    public  ICollection<Phone> PhoneNumbers { get; set; }
    public  ICollection<Email> EmailAddresses { get; set; }
    public  ICollection<Corrospondence> Corrospondence { get; set; }
    public  ICollection<ShippingAddress> ShippingAddresses { get; set; }
}

それは私のモデルがどのように見えるかです、

var query = context.TeacherCustomers
    .Include(i => i.EmailAddresses)
    .Include(i => i.Corrospondence)
    .Include(i => i.Address.City.Country)
    .Include(i => i.ShippingAddresses)
    .Include(i => i.Sales.Select(f => f.BuildVersion.Product))
    .Include(i => i.PhoneNumbers)
    .Include(i => i.Partner1.Select(f => f.Address.City.Country))
    .Include(i => i.Partner2.Select(f => f.Address.City.Country))
    .AsNoTracking();

それが私のクエリのようです。私のビジネスロジックでは、すべての電子メールアドレス、電話番号、...が必要です。すべてのインクルードステートメントにコメントすると、このクエリは約82ミリ秒で実行され、すべてのインクルードステートメントにコメントがない場合、クエリには約52000ミリ秒かかります(最初のクエリではありません)。したがって、データベースモデルはすでにコンパイルされています)。

この投稿では、問題について非常によく説明しています。パフォーマンスを維持するために、EntityFrameworkのObjectSetでいくつのインクルードを使用できますか?、しかし、私のデータベースには10,000を超えるエントリが含まれており、クエリを実行してから、クエリによって返されたすべての顧客をステップスルーし、context.Entry(customer).Reference(i => i.EmailAddresses).Load()にも多くの時間がかかります。

では、上記のクエリと同じ結果になるが、より高速に実行されるクエリを作成するにはどうすればよいですか?

助けていただければ幸いです

4

1 に答える 1

0

このモデルから多くのパフォーマンスを引き出すことができるかどうかはわかりません。基本的にすべてのテーブルをクロス結合しているため、巨大なテーブルと多くのレコードが得られます。

モデルを再考することをお勧めします。少し非正規化する可能性があります。本当にメール用のテーブルが必要ですか。電話番号はテーブルの複数の列にすることはできません(ほとんどのアプリでは2つ以上のメールや電話番号は必要ありません)。

モデルについて何もできない場合は、1つのクエリを使用してすべての顧客をロードし、1つを使用してすべての電子メールをロードするなど、すべてのテーブルを個別にロードしてからモデルに結合することをお勧めします。提供した統計に基づくと、すべてのデータをロードするのに400ミリ秒もかかりません。

于 2012-08-24T15:52:32.603 に答える