Sql server 2008 SQL性能-按多个字段分组

Sql server 2008 SQL性能-按多个字段分组,sql-server-2008,Sql Server 2008,我想知道哪种练习更好和/或更快。在下面的示例中,customer_id是主键。按主键分组,以及其他5个字段,或者只按主键分组,然后进行连接以获取其他字段。或者这是一个“视情况而定”的问题 select customer_id, customer_name, customer_address, 5 other description fields.., sum(amount) as SalesAmount from customer c inner join orders o on o.c

我想知道哪种练习更好和/或更快。在下面的示例中,customer_id是主键。按主键分组,以及其他5个字段,或者只按主键分组,然后进行连接以获取其他字段。或者这是一个“视情况而定”的问题

select customer_id, customer_name, customer_address, 5 other description fields.., 
  sum(amount) as SalesAmount
from customer c
inner join orders o
 on o.customer_id = c.customer_id
group by customer_id, customer_name, customer_address, 5 other description fields..
vs


我认为通常的经验法则是,如果出于风格原因没有其他原因,尽可能避免子查询(并提高查询优化器理解您所说内容的可能性)。

但是,对于SQL性能问题,只有一个正确答案:您可以自己在数据上试用。

我认为第一段代码更容易阅读,这通常是选择如何操作的一个很好的起点

你自己也在猜测:这是一个“视情况而定”的问题,理论上无法回答。你必须自己调查一下,根据你的实际数据

  • 性能是个问题吗
  • 您是否运行了代码并检查了查询执行计划中的瓶颈
  • 您是否添加了任何建议的索引

  • 数据库查询性能始终取决于它


    对真实数据集使用探查器或测试备选方案。

    这是一个依赖性问题。后一种变体将再执行一次连接,这可能会更慢。但是,如果从该联接中获得的附加数据很大,则速度会更快,因为分组操作不需要洗牌所有数据

    所以你看,两种变体都有比另一种更快的情况。你需要测量


    我的猜测是,对于实际数据和查询,第一个变量通常要快得多。

    执行计划显示了什么?我认为在后一个查询中,连接子查询是不必要的。我认为在后一个查询中,连接子查询是不必要的。看见
    select customer_id, customer_name, customer_address, 5 other description fields..,
         SalesAmount
    from 
    (
       select customer_id,
       sum(amount) as SalesAmount
       from customer c
       inner join orders o
         on o.customer_id = c.customer_id
       group by customer_id
    ) t
    inner join customer c
       on c.customer_id = t.customer_id