2

多くの人と同じように、コードをできるだけシンプルで読みやすく保ちながら、アプリから最高のパフォーマンスを引き出すことを目指しています。私はLinq-to-SQLを使用しており、データレイヤーを可能な限り宣言的に保つようにしています。

私は、SQL 呼び出しが最もコストのかかる操作であるという前提に基づいて操作しています。したがって、私はそれらの量を最小限に抑えようとしていますが、最適化が難しい非常に複雑なクエリは避けようとしています.

適切な例: 私はDataContext でDataLoadOptionsを使用しています。その目標は、関連するエンティティをプリロードすることにより、クエリの量を最小限に抑えることです。(別名、熱心な読み込みと遅延読み込み。)

問題: Linq は結合を使用して目標を達成します。すべてと同様に、それはトレードオフです。取得するクエリは少なくなりましたが、これらの結合されたクエリはより複雑でコストがかかります。SQL Profiler に入ると、これが明確になります。

したがって、結合なしでプリロードするためのLinqのオプションが必要です。これは可能ですか?これは次のようになります。

多対多の関係を提供するテーブル、PersonsテーブルItems、およびテーブルがあります。PersonItemsPersons のコレクションをロードするとき、PersonItems と Items もすべて積極的にロードしたいと思います。

Linq は現在、2 つの結合を含む 1 つの大きなクエリでこれを行います。個人用、それらの個人に関連するすべての PersonItems 用、およびそれらの PersonItems に関連するすべてのアイテム用の 3 つの非結合クエリです。次に、Linq はそれらを関連するエンティティに自動的に配置します。

これらはそれぞれ、高速なファイアホース タイプのクエリになります。長期的には、予測可能な Web スケールのパフォーマンスが可能になります。

それが行われたのを見たことがありますか?

4

1 に答える 1

0

3 つの非結合クエリが実行される場所について説明したことは、基本的に、単一の結合クエリが実行されたときに内部で発生することだと思います。私は間違っている可能性がありますが、この場合、3 つではなく 1 つのデータベース クエリのみが関与するため、1 つのクエリの方が効率的です。パフォーマンスの問題がある場合は、参加している列がインデックス化されていることを確認します (SQL プロファイラーでテーブル スキャンが表示されないはずです)。これでは不十分な場合は、必要なデータだけを取得するカスタム ストアド プロシージャを作成できます (すべてのオブジェクトのすべての列が必要ないと仮定すると、これにより、インデックス スキャンよりも高速なインデックス シークを利用できるようになります)。または、非正規化 (テーブル間でデータを複製) して、結合がまったく発生しないようにすることもできます。

于 2011-03-14T09:35:09.540 に答える