SQL性能 - 由许多领域分组
问题描述:
我想知道哪种更好的做法和/或更快。在下面,customer_id是主键。通过主键和其他5个字段进行分组,或者通过主键进行分组,然后通过加入来获取其他字段。或者这是一个“取决于”的问题?SQL性能 - 由许多领域分组
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
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
答
这是一个依赖问题。后一种变体会再做一次连接,这可能会变慢。但是,如果从此连接获得的附加数据很大,则速度会更快,因为分组操作无需混洗所有数据。
所以你看,有两种变种比其他变种更快。你需要测量。
我的猜测是,对于真实的数据和查询,第一个变体通常要快得多。
答
我觉得拇指一般规则是为了避免子查询时可能的,如果没有别的文体上(和改善的机会,查询优化器会明白你在说什么关于)。
但是,SQL性能问题只有一个正确的答案:自己尝试一下数据。
答
我认为第一个代码更容易阅读,这往往是选择如何做事情的一个很好的起点。
你在猜测它自己:这是一个“它取决于”的问题,无法从理论上回答。你必须自己调查一下你的实际数据。
- 是性能问题吗?
- 您是否运行了代码并检查了查询执行计划中的瓶颈?
- 您是否添加了建议的索引?
执行计划显示什么? – Lamak 2012-03-06 20:42:34