我想知道哪个更好和/或更快。在下面,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..
对比
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
最佳答案
这是一个依赖问题。后一种变体将再执行一次连接,这可能会更慢。但是如果你从这个 join 得到的额外数据很大,它可以更快,因为分组操作不需要对所有数据进行 shuffle。
所以你看,两种变体都有比另一个更快的场景。你需要测量。
我的猜测是,对于真实数据和查询,第一个变体通常要快得多。
关于sql-server-2008 - SQL 性能 - 按多个字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591497/