0

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秒は実際には多すぎます)。しかし、これはどちらかによってより速くすることができます

  1. 削除order by(約2倍高速)
  2. 昇順で並べ替える(クラスター化されたインデックスは昇順であり、それ以外の場合はできません)
  3. 追加option(loop join)(非常に高速)
  4. 左外部結合を使用
  5. 追加Where FormTypeID = 1(すべての注文に対して1であるマスターテーブルの識別子列)(2倍高速)

実際、同じ結果が得られた唯一のソリューションは3と5ですが、Entity Frameworkを使用して3を使用することは不可能であり(クエリにヒントを追加することはできません)、5は十分に高速ではありません。

どんな提案でも大歓迎です。

4

2 に答える 2

3

プラン ガイドを使用して、目的の動作を取得できます。例については、「プラン ガイドのクエリ ヒントの使用」を参照してください。この例では実際のステートメント テキスト (EF によって生成された T-SQL) が必要ですが、 を使用して EF によって生成されたステートメントを取得する必要を回避できますsp_create_plan_guide_from_handle

次のプロジェクトでは、すべてのエンティティが派生するベースオブジェクトでClass Table Inheritanceを使用しないでください...Master

于 2012-04-08T16:08:15.143 に答える
1

クエリ ヒントを強制する場合。あなたの最善の叫びは、ストア プロシージャを作成し、クエリ ヒントを使用することだと思います (詳細はこちらを参照)。または、次のようなこともできます。

var items = dc.ExecuteQuery<ToSomeObject>("YourQueryWithHints").ToList();
于 2012-04-08T11:46:50.293 に答える