SQLクエリの結果セットがサーバーからクライアントにどのように転送されるのか知りたいです。
ほとんどのO/Rマッパーは、熱心な読み込みと遅延読み込みの両方をサポートしており、どちらにも長所と短所があります。たとえば、Entity Framework4(.NET)は、熱心なロードサポートを備えています。
ただし、次のようなモデルがあると仮定します。
BlogPost
{
public string Body {get;set;}
ICollection<Comment> Comments {get;set;}
}
..。
そしてこのようなクエリ:
var posts = context
.Posts
.Include(post => post.Comments)
.Where(post => post.Id == 1)
.First();
これにより、単一のSQLクエリが生成され、「投稿」のすべてのデータが「コメント」ごとに各行で繰り返されます。
特定の投稿に100件のコメントがあり、Post.Bodyは膨大な量のテキストであるとします。これは良くないのですか?または、データをクライアントに送信するときに何らかの形で圧縮されているため、各行でデータを繰り返すオーバーヘッドが最小限に抑えられていますか?
そのようなクエリの1つが2つの単純なクエリ(1つは投稿の取得用、もう1つはコメントの取得用)よりも効率的かどうかを判断するための最良の方法は何ですか?
開発環境でこれをベンチマークすることは非常に無意味です。ここには複数の要因があります。SQLサーバーのCPU負荷ネットワーク負荷アプリサーバーのCPU負荷(オブジェクトの実体化)
これについてのアイデア?
[編集]説明:
2つのクエリは次のようになります。
sql
select * from post where postid = 123
結果
id , topic, body , etc...
sql
select * from comment where postid = 123
結果
id,postid, commenttext , etc...
最初のクエリは1行を生成し、2番目のクエリはコメントと同じ数の行を生成します。
単一のクエリでは、特定の投稿のコメントと同じ数の行がありますが、すべての投稿データが各行で繰り返されます。
結果
p.id , p.topic, __p.body__, c.id, c.postid, c.commenttext
p.bodyは各行で繰り返されるため、結果セットは非常に大きくなります。(p.bodyに多くのデータが含まれていると仮定します;-)