我对如何将 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 包含大量数据;-)