2012-04-08 4 views
0

私はEFモデルでTPT継承を持っています。 「マスター」抽象タイプが存在し、そこから複数のタイプが継承されます(「オーダー」を含む)。 1700000発注がありますが、マスターには他のタイプに対応する行がさらに多くあります。1対1の結合SQLサーバーで十分に速くない

50件の注文を選択するのが同じ50件の注文を選択するよりも遅かったが、他の関連するエンティティが含まれているという奇妙なケースがあった。それは非常に単純なクエリがデータベースに戻って追跡した。

は1秒以上かかる。 (はい、私たちの場合、1秒は実際には多すぎます)。しかし、これはoption(loop join)(非常に高速を追加昇順(クラスタ化インデックスは昇順であり、それ以外にはできません)

  • でソートorder by(約2倍の速さ)
  • を削除

    1. によって高速化のいずれか行うことができます左外側を使用して)
    2. )は、(二倍高速
    0をすべての注文の1であるマスターテーブルにWhere FormTypeID = 1(識別子列)を追加
  • に参加します

    実際に同じ結果をもたらした唯一の解決策は、3と5ですが、3は、Entity Frameworkの(私たちはクエリにヒントを追加することはできません)と5は、任意の提案は大歓迎され、十分な

    速くない使用は不可能です。

  • +0

    まさにあなたの質問は何ですか? –

    +0

    クエリの実行速度を改善するにはどうすればよいですか? – Alireza

    +0

    あなたは私どもよりも自分の疑問に答えました。私たちは野生の推測をしているだけです。 –

    答えて

    3

    あなたが望む挙動を得るためにplan guidesを使用することができます。例については、Using Query Hints in Plan Guidesを参照してください。この例では、実際のステートメントテキスト(EFによって生成されたT-SQL)が必要ですが、sp_create_plan_guide_from_handleを使用してEF生成ステートメントを取得する必要性を回避することができます。

    すべてのエンティティから派生ベース Masterオブジェクトと Class Table Inheritanceを使用して、あなたの次のプロジェクトの回避に

    ...

    +0

    ありがとう、私は明日あなたの提案を読んで使用しようとします。 Btw、私たちはMasterからすべてを継承しているわけではなく、特定のプロセスで遭遇したフォームのマスターだけです。これもまた詳細に起こります。具体的なタイプに関係なく、マスターとディテールで作業する非常に面白いツールがあります。パフォーマンス上の問題を回避するために、継承のすべての利点を放棄したい場合は、オブジェクトデータベースを使用するか、少なくともnhibernateに変更するなど、非常に過激な作業を行う場合があります(コードを拡張して、欲しいです)。 – Alireza

    +0

    ありがとうございます。これがこの問題を解決すると思われます。 – Alireza

    1

    クエリヒントを強制的に実行する場合。あなたの最高の叫び声は、ストアプロシージャを作成してクエリヒントを使用することです(詳細はhereを参照してください)。それとも、このような何かを行うことができます。

    var items = dc.ExecuteQuery<ToSomeObject>("YourQueryWithHints").ToList(); 
    
    +0

    ありがとうございます。残念ながら、これはLINQをエンティティに使用する多くの機能を備えた大規模システムの一部であり、ストアドプロシージャを使用するとほとんどの機能がブロックされます。 – Alireza

    +1

    次に、 'ExecuteQuery'をいくつかのものとして使用することを検討するかもしれません。 Linqのヒントだけを照会することはできないからです。 – Arion

    関連する問題