Sql server 2008 SQL性能-按多个字段分组
我想知道哪种练习更好和/或更快。在下面的示例中,customer_id是主键。按主键分组,以及其他5个字段,或者只按主键分组,然后进行连接以获取其他字段。或者这是一个“视情况而定”的问题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
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