详解SQL优化小技巧—避免排序
概述
大家都知道数据库有些命令会对结果进行排序,当数据量较大时,排序会非常耗时。今天主要讨论如何避免无谓的排序,提升SQL执行效率。
会进行排序的SQL 命令
下面列举会排序的代表性运算:
GROUP BY 子句
ORDER BY 子句
聚合函数(SUM,COUNT,AVG,MAX,MIN)
DISTINCT
集合运算(UNICON,INTERSECT,EXCEPT)
窗口函数(RANK,ROW_NUMBER等)
实例
下面通过两个示例进行说明,分别是union 和 distinct。
1、尽可能使用 union all 代替 union
SELECT * FROM TABLE_A UNION ALL SELECT * FROM TABLE_B;
如果不在乎结果中存在重复数据,或预先知道结果中不会有重复数据。请使用union all 代替 union,这样就不会进行排序。
2、尽可能使用exists 代替 distinct
示例数据说明,下面有商品表和销售记录表。
Items:
SalesHistory:
需求::查找有销售记录的商品。
可以使用in方式实现,但因为in会产生子查询,不如使用连接查询效率高。
SELECT DISTINCT I.item_no FROM Items I INNER JOIN SalesHistory S ON I.item_no = S.item_no;
因为是一对多查询,会产生重复记录,所有使用DISTINCT过滤重复记录。
但更好的做法是使用exists方式:
SELECT DISTINCT I.item_no FROM Items I WHERE EXISTS ( SELECT * FROM SalesHistory S WHERE I.item_no = S.item_no );
说明:因为使用exists 查询时不会进行排序,而且使用exists和使用连接效率一样高。
总结
今天主要讨论了如何在SQL中避免出现无谓的排序,通过两个示例进行说明,尽量使用union all 代替 union,exists 代替 distinct。
后面会分享更多DBA方面内容,感兴趣的朋友可以关注下!
相关推荐
vitasfly 2020-11-12
gsmfan 2020-07-26
明月清风精进不止 2020-07-05
FORYAOSHUYUN 2020-07-05
URML 2020-07-04
minggehenhao 2020-06-21
hungzz 2020-06-16
ribavnu 2020-11-16
要啥自行车一把梭 2020-11-12
ILVNMM 2020-09-19
zycchun 2020-10-16
康慧欣 2020-09-10
liuweiq 2020-09-09
silencehgt 2020-09-07
sunnyxuebuhui 2020-09-07
西瓜皮儿的皮儿 2020-09-07
李轮清 2020-09-15
lifeison 2020-08-18
cyhgogogo 2020-08-18