1

スケジューリング カレンダーを読み込んでいますが、多くのテーブルから関連データを積極的に読み込む最速の方法ServiceTripsがあるかどうか疑問に思っています。

ロードする必要があるモデルは次のとおりです (マッピングは具象型ごとのテーブルです)

public class ServiceTrip : BaseEntity
{
    public ICollection<Employee> Crew { get; set; }
    public ICollection<ServiceAssignment> Assignments { get; set; }
}

public class ServiceAssignment : BaseEntity
{
    public ServiceOrder ServiceOrder { get; set; }
    public DeliveryOrder DeliveryOrder { get; set; }
}

public class ServiceOrder : OrderBase { }
public class DeliveryOrder : OrderBase { }

public abstract class OrderBase : BaseEntity
{
    public ICollection<ServiceAssignment> Assignments { get; set; }
    public Sale Sale { get; set; }
}

public class Sale : BaseEntity
{
    public Employee Manager { get; set; }
    public Customer Customer { get; set; }
    public ICollection<ServiceOrder> ServiceOrders { get; set; }
    public ICollection<DeliveryOrder> DeliveryOrders { get; set; }
}

public class Employee : BaseEntity { }
public class Customer : BaseEntity { }

public abstract class BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

私は基本的にこのようなことを試しましたが、どこから始めればよいかわかりません。

var tripsQuery = db.ServiceTrips

.Where(x => x.StartDate >= FirstDay && x.StartDate <= LastDay)

.Include(x => x.Crew)
.Include(x => x.ServiceAssignments)

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder))

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder.Sale))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder.Sale))

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder.Sale.Customer))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder.Sale.Customer))

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder.Sale.Manager))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder.Sale.Manager))
;

モデルは質問のために単純化されています。本番環境では、約 20 のテーブルからプルしています。ロードには約 10 ~ 15 秒かかります。毎日非同期でロードしようとしましたが、ロードにかかる合計時間が長くなりました。

4

1 に答える 1

1

私の意見では、20 個のテーブルを結合する複雑なクエリを発行する場合、データベース自体の検査から始めたいと思うかもしれません。

ここにいくつかのガイドラインがあります (いくつかのポイントは SQL Server に関連しています。使用しているデータベースであると自由に仮定しています)

  1. 生の SQL でクエリ実行プランを確認します。SQL で EF コード全体を再現するのに時間がかかる場合は、その一部だけを再現する必要があります。たとえば、ServiceTrips、ServiceAssignments、DeliveryOrder テーブルなどです。これにより、インデックスなどに関するボトルネックのアイデアが得られます

  2. データのサイズが原因で、ネットワーク遅延がボトルネックであり、クエリ自体ではないかどうかを調べます

  3. パフォーマンスを向上させる可能性のあるインデックス付きビューの使用を検討してください

  4. アーキテクチャ- このような複雑なクエリを高速化するには、何らかのキャッシュを使用して関連データを保存します。あなたの場合は、マネージャー、クルーなどの名前です。

于 2013-06-21T05:42:33.900 に答える