EFモデルにTPT継承があります。「Order」を含むいくつかの型が継承する「Master」抽象型がある場合。1700000の注文がありますが、マスターには他のタイプに対応するさらに多くの行があります。
50の注文を選択するのが、同じ50の注文を選択するよりも遅いという奇妙なケースがありましたが、他のいくつかの関連エンティティが含まれていました。非常に単純なクエリが実行されたデータベースまで追跡しました
select top 50 * from SAM.Master m
join SAL.[Order] o on o.OrderMasterID = m.MasterID
order by MasterID desc
1秒以上かかります。(はい、私たちの場合、1秒は実際には多すぎます)。しかし、これはどちらかによってより速くすることができます
- 削除
order by
(約2倍高速) - 昇順で並べ替える(クラスター化されたインデックスは昇順であり、それ以外の場合はできません)
- 追加
option(loop join)
(非常に高速) - 左外部結合を使用
- 追加
Where FormTypeID = 1
(すべての注文に対して1であるマスターテーブルの識別子列)(2倍高速)
実際、同じ結果が得られた唯一のソリューションは3と5ですが、Entity Frameworkを使用して3を使用することは不可能であり(クエリにヒントを追加することはできません)、5は十分に高速ではありません。
どんな提案でも大歓迎です。