SQL优化必知技巧—— 避免排序

SQL优化必知技巧—— 避免排序

我们知道 sql 语言中,用户不能显示地命令数据库进行排序操作。对用户隐藏这样操作正式SQL的设计思想。但数据库有些命令会对结果进行排序,当数据量较大时,排序会非常耗时。本文我们讨论如何避免无谓的排序,提升SQL执行效率。

会进行排序的SQL 命令

下面列举会排序的代表性运算:
  • GROUP BY 子句
  • ORDER BY 子句
  • 聚合函数(SUM,COUNT,AVG,MAX,MIN)
  • DISTINCT
  • 集合运算(UNICON,INTERSECT,EXCEPT)
  • 窗口函数(RANK,ROW_NUMBER等)

示例说明

下面通过两个示例进行说明,分别是union 和 distinct。

尽可能使用 union all 代替 union

SELECT * FROM TABLE_A
UNION ALL
SELECT * FROM TABLE_B;

如果不在乎结果中存在重复数据,或预先知道结果中不会有重复数据。请使用union all 代替 union,这样就不会进行排序。

尽可能使用exists 代替 distinct

示例数据说明,下面有商品表和销售记录表。

Items:

item_noitem
10FD
20CD-R
30MO
40DVD

SalesHistory:

sale_dateitem_noitem
2018-01-01104
2018-01-01205
2018-01-01303
2018-01-03107
2018-01-03109
2018-01-04202
2018-01-043012

问题:查找有销售记录的商品。

当然我们可以使用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。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值