SQL - 查询优化

Posted

技术标签:

【中文标题】SQL - 查询优化【英文标题】:SQL - query optimization 【发布时间】:2012-09-05 16:26:53 【问题描述】:

假设您有以下表格:

TABLE Car
car_id
num

TABLE Car_description
dsc_id
car_id
model

TABLE Result
res_id
car_id
race_num
result

任务是为我们拥有超过 2 辆汽车的比赛选择最高平均分数,并为最好的汽车选择 Car.num、Car_description.model。解决它的一种方法是编写以下查询。

select r.race_num,
       MAX(score) as MaxScore,
       AVG(score) as AvgScore,
       MAX(case when seqnum = 1 then c.carnum end) as TopCarNum,
       MAX(case when seqnum = 1 then cd.model end) as TopCarModel
from (select r.*,
             ROW_NUMBER() over (partition by race_num order by score desc) as seqnum
      from Result r
     ) r left outer join
     Car c
     on c.car_id = r.car_id left outer join
     Car_Description cd
     on c.car_id = d.car_id
group by r.race_num
having COUNT(*) > 2

但是这里我们在内部查询中对结果表进行排序,而不是选择最大元素,我认为这会很耗时。是这样吗?我们如何优化它?谢谢。

【问题讨论】:

"我觉得会比较费时间"然后测试一下。 【参考方案1】:

我不确定这是否有助于提高性能,但请尝试

SELECT r.race_num,
   MAX(score) as MaxScore,
   AVG(score) as AvgScore,
   MAX(case when mr.max_score IS NOT NULL then c.carnum end) as TopCarNum,
   MAX(case when mr.max_score IS NOT NULL then cd.model end) as TopCarModel
FROM Result LEFT OUTER JOIN 
    (SELECT r.race_num, MAX(score) max_score FROM Result r GROUP BY r.race_num) mr 
    ON Result.res_num = mr.res_num AND Result.score = mr.max_score
 LEFT OUTER JOIN Car c
 ON c.car_id = Result.car_id 
 LEFT OUTER JOIN Car_Description cd
 ON c.car_id = d.car_id
 GROUP BY r.race_num
 HAVING COUNT(*) > 2

【讨论】:

没关系,你只是在内部选择中忘记了group by。谢谢。

以上是关于SQL - 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

数据库牛人是如何进行SQL优化的?

SQL多个表联合查询优化的问题

DBA的五款最佳SQL查询优化工具

优化SQL查询:如何写出高性能SQL语句

SQL优化----百万数据查询优化

一文终结SQL 子查询优化