SQL性能 - 由许多领域分组

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 
+0

执行计划显示什么? – Lamak 2012-03-06 20:42:34

这是一个依赖问题。后一种变体会再做一次连接,这可能会变慢。但是,如果从此连接获得的附加数据很大,则速度会更快,因为分组操作无需混洗所有数据。

所以你看,有两种变种比其他变种更快。你需要测量。

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

我觉得拇指一般规则是为了避免子查询时可能的,如果没有别的文体上(和改善的机会,查询优化器会明白你在说什么关于)。
但是,SQL性能问题只有一个正确的答案:自己尝试一下数据。

我认为第一个代码更容易阅读,这往往是选择如何做事情的一个很好的起点。

你在猜测它自己:这是一个“它取决于”的问题,无法从理论上回答。你必须自己调查一下你的实际数据。

  1. 是性能问题吗?
  2. 您是否运行了代码并检查了查询执行计划中的瓶颈?
  3. 您是否添加了建议的索引?

数据库查询性能总是取决于它。

使用探查器或测试替代品与一个现实的数据集。

+0

没用...... – usr 2012-03-06 20:48:56