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 是一个巨大的文本片段。这不好吗?或者数据在发送到客户端时是否以某种方式压缩,从而最大限度地减少每行重复数据的开销?

确定一个这样的查询是否比两个简单的查询(一个用于获取帖子,一个用于获取评论)更有效的最佳方法是什么?

在开发环境中对此进行基准测试毫无意义,这里有多个因素: SQL 服务器上的 CPU 负载 网络负载 应用服务器上的 CPU 负载(物化对象)

对此有什么想法?

[编辑] 澄清:

两个查询将是这样的:

sql

select * from post where postid = 123

结果

id , topic, body , etc...

sql

select * from comment where postid = 123

结果

id,postid, commenttext , etc...

第一个查询将产生一行,第二个查询将产生与评论一样多的行。

对于单个查询,特定帖子的评论数将与评论数一样多,但所有帖子数据在每一行上重复。

结果

p.id , p.topic, __p.body__, c.id, c.postid, c.commenttext

p.body 将在每一行上重复,从而使结果集非常大。(假设 p.body 包含大量数据;-)

4

2 回答 2

0

我认为这实际上归结为以下几点:

  • 有多少个帖子?
  • 获取帖子的评论有多复杂?

如果您有几百万个帖子,最好使用单个查询,即使每个帖子有多个评论,因为汇总的往返时间将比传输附加数据的时间差得多。
所以,我认为你需要有敏锐的眼光;-)
而且,我认为开发环境中的基准测试并不是毫无意义的,因为它至少可以给出两种方法之间的关系。

于 2011-02-18T12:18:58.157 回答
0

拥有返回大量行的单个查询几乎总是比返回单个行的大量查询要快。

但是,在您的情况下,首先检索用户,然后是所有评论(使用单个查询)可能比在一个查询中获取所有内容更有效。

于 2011-02-18T12:32:40.210 回答