10

私は、新しい Web ベースのレポート システムのデータ レイヤー基盤を調査しており、ここ数日間、ORM の評価に多くの時間を費やしてきました。そうは言っても、私はこれまで「遅延読み込み」を扱ったことがなく、Entity Framework の LINQ クエリの既定の設定である理由に混乱しています。大量のネットワーク トラフィックが発生し、結合で解決できる追加のクエリをデータベースに不必要に処理しているようです。

遅延読み込みが有益なシナリオを誰か説明できますか?

いくつかのメタ:

新しいシステムは、1 日 24 時間システム上で 3,000 人を超える同時ユーザーがいる運用環境で、数百のテーブルと数テラバイトのデータを持つデータベースに対して動作します。彼らは大規模なデータセットを継続的に取得します。特にアプリが Web ベースになるため、ORM が私たちのニーズに適したソリューションではない可能性はありますか?

4

3 に答える 3

7

遅延読み込みについて話すときは、ナビゲーション プロパティ (外部キーを追跡する方法) について話しています。遅延読み込みが行うことは、エンティティへのアクセスを試みるときに、リモート テーブルからエンティティにデータを入力することです。たとえば、このようなモデルがある場合

public class TestEntity
{
    public int Id{get;set;}
    public AnotherEntity RemoteEntity{get;set;}
}

そして、以下を呼び出します

var something = WhateverContext.TestEntities.First().RemoteEntity;

1 つはリモート エンティティをロードするためのものでWhateverContext.TestEntities.First()、もう 1 つはリモート エンティティをロードするためのものです。

私は Web 担当者 (より具体的には MVC 担当者) であり、Web に関しては、これを実行する正当な理由はないと思います。必要な場合、1 つのデータベース呼び出しは常に 2 回よりも高速になります同じデータセット。

遅延読み込みが実際に検討する価値があると私が考える状況は、2 番目のエンティティが必要になるかどうか、最初のクエリをいつ実行するかわからない場合です。私の意見では、これは (ユーザーがページ全体を一度に要求しているステートレス MVC ではなく) リアルタイムでアクションを実行しているユーザーがいる Windows アプリケーションにはるかに関連しています。たとえば、詳細リンクを含むデータのリストがある場合、遅延読み込みが優れていると思います。その後、ユーザーが詳細を表示することを決定するまで、詳細を読み込みません。

これがページング、並べ替え、フィルタリングに及ぶとは思いません。IMO では、表示しているデータのページごとに 1 つの特別に細工されたデータベース クエリが必要であり、そのページを表示するために必要なデータ セットを正確に返します。

パフォーマンスの質問に関しては、EF (または別の ORM) がおそらくここでのニーズを満たすことができると思いますが、EF がエンティティを追跡する方法のために、大規模なデータセットを取得する方法に注意する必要があります。私のEF パフォーマンス チューニング チート シートを確認し、大規模なクエリで EF を使用することに決めた場合は、 DetectChangesAsNoTrackingを読んでください。

于 2012-12-22T04:20:56.197 に答える
2

単純なケースは、一度にクライアントに提供したくない N レコードの結果セットです。利点は、並べ替え、フィルタリングなど、クライアントの要求に必要なものだけを遅延してロードできることです。例としては、レコードをページングし、それに応じて並べ替えることができるページング ビューがあります。所定の時間に必要な量は N だけです。

LINQ クエリを実行すると、それがサーバー側の SQL コマンドに変換され、特定のコンテキストで必要なものだけが提供されます。つまり、作業をデータベースにオフロードし、クライアントに返送する必要があるものを最小限に抑えます。

ORM ベースの遅延読み込みは間違っていると主張する人もいますが、それはかなり早くセマンティクスに移行し始めており、何が正しくて何が間違っているかよりも、設計へのアプローチについてもっと考えるべきです。

于 2012-12-22T03:26:47.647 に答える
2

ほとんどの ORM では、オブジェクトの選択を構築するときに、「怠惰にならないで、参加してください」と言うオプションが提供されます。したがって、効率の観点から心配している場合は、そうしないでください。 . あなたはそれを機能させることができます(通常)。

遅延読み込みが役立つ特定のケースが 2 つあります。

  1. コマンドの連鎖 基本的な選択を作成したいが、ユーザー入力に基づいた並べ替えとフィルター関数を使用して実行したい場合はどうでしょう。ORM オブジェクトを渡すだけで、並べ替えとフィルタリングの機能を追加できます。毎回評価するのではなく、実際に使用されたときにのみ評価します。

  2. 大規模で深い、高度に関連性のあるクエリを回避する 関連するフィールドの ID だけが必要な場合はどうすればよいでしょうか? 読み込みが遅い場合は、必要のない大量のデータとテーブルを結合して、クエリの速度が低下し、帯域幅が過剰に使用される可能性があることを心配する必要はありません。もちろん、他のすべてが必要な場合は、明示的に行う必要があります。そうしないと、詳細レコードごとにクエリが遅延して実行されるという問題が発生する可能性があります。最初に述べたように、これは、使用する価値のある ORM であれば簡単に克服できます。

于 2012-12-22T03:30:45.600 に答える