O / R映射:单个复杂查询与多个简单查询

时间:2011-02-18 12:02:36

标签: sql linq performance entity-framework-4 cartesian-product

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

2 个答案:

答案 0 :(得分:0)

我认为这真的归结为以下几点:

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

如果您有几百万个帖子,那么使用单个查询会更好,即使您对每个帖子都有多条评论,因为汇总的往返时间将比传输其他数据的时间差得多。
所以,我认为你需要有一个敏锐的眼睛;-)
而且,我认为开发环境中的基准测试并非毫无意义,因为它至少可以提供两种方式之间的关系。

答案 1 :(得分:0)

只有一个返回大量行的查询几乎总是比很多只返回一行的查询要快。

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