0

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に多くのデータが含まれていると仮定します;-)

4

2 に答える 2

0

多くの行を返す 1 つのクエリを使用することは、ほとんどの場合、1 つの行だけを返す多くのクエリよりも高速です。

ただし、あなたの場合、最初にユーザーを取得し、次にすべてのコメントを (単一のクエリで) 取得する方が、1 つのクエリですべてを取得するよりもおそらく効率的です。

于 2011-02-18T12:32:40.210 に答える
0

私はそれが本当に次のことに帰着すると思います:

  • 投稿数はいくつですか?
  • 投稿のコメントを取得するのはどれくらい複雑ですか?

数百万件の投稿がある場合、投稿ごとに複数のコメントがある場合でも、単一のクエリを使用することをお勧めします。これは、集計された往復時間が追加データの転送時間よりもはるかに長くなるためです。
ですから、鋭い目を持つ必要があると思います;-)
また、開発環境でのベンチマークは無意味ではないと思います.

于 2011-02-18T12:18:58.157 に答える