我对SQL查询的结果集如何从服务器传输到客户端感到很沮丧。
大多数O / R映射器都支持急切和懒惰的负载,两者都有其优缺点。 例如实体框架4(.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条评论.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包含大量数据; - )
答案 0 :(得分:0)
我认为这真的归结为以下几点:
如果您有几百万个帖子,那么使用单个查询会更好,即使您对每个帖子都有多条评论,因为汇总的往返时间将比传输其他数据的时间差得多。
所以,我认为你需要有一个敏锐的眼睛;-)
而且,我认为开发环境中的基准测试并非毫无意义,因为它至少可以提供两种方式之间的关系。
答案 1 :(得分:0)
只有一个返回大量行的查询几乎总是比很多只返回一行的查询要快。
在您的情况下,首先检索用户,然后所有注释(使用单个查询)可能比在一个查询中获取所有内容更有效。