sql双重排序(SQL优化避免排序-union)

概述

大家都知道数据库有些命令会对结果进行排序,当数据量较大时,排序会非常耗时。今天主要讨论如何避免无谓的排序,提升SQL执行效率。

sql双重排序(SQL优化避免排序-union)(1)


会进行排序的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:

sql双重排序(SQL优化避免排序-union)(2)

SalesHistory:

sql双重排序(SQL优化避免排序-union)(3)

需求::查找有销售记录的商品。

可以使用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方面内容,感兴趣的朋友可以关注下!

sql双重排序(SQL优化避免排序-union)(4)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页