SQL性能优化


本文将介绍一些使SQL执行速度更快、消耗内存更少的优化技巧


  • 参数是子查询时,使用EXISTS代替IN

    在大多数时候,[NOT] IN 和 [NOT] EXISTS返回的结果是相同的,但是两者用于子查询时,EXISTS的速度会更快一些,原因如下:

    当IN的参数是子查询时,数据库首先会执行子查询,然后将结果存储在一张临时的工作表里(内联视图),然后扫描整个视图。很多情况下这种做法都非常耗费资源。使用EXISTS的话,数据库不会生成临时的工作表


  • 避免排序

    会进行排序的代表性的运算包括:

    1. GROUP BY子句
    2. ORDER BY 子句
    3. 聚合函数(SUM、COUNT、AVG、MAX、MIN)
    4. DISTINCT——为了排除重复数据而进行排序
    5. 集合运算符(UNION、INTERSECT、EXCEPT)—— 这些运算符会为了排除掉重复数据而进行排序
    6. 窗口函数(RANK、ROW_NUMBER等)

  • 使用索引时,条件表达式的左侧应该是原始字段,否则无法使用索引,从而降低性能

  • 使用EXISTS代替DISTINCT

    为了排除重复数据,DISTINCT也会进行排序。如果需要对两张表的连接结果进行去重,可以考虑使用EXISTS代替DISTINCT,以避免排序

  • 能写在WHERE子句里的条件不要写在HAVING子句里

    这是因为在使用GROUP BY子句聚合时会进行排序,如果是想通过WHERE子句筛选出一部分行,就能够减轻排序的负担;其次,在WHERE子句的条件里可以使用索引。HAVING子句是针对聚合后生成的视图进行筛选的,但是很多时候聚合后的视图都没有继承原表的索引结构

  • 减少中间表的使用

    频繁地使用中间表会带来两个问题,一是展开数据需要耗费内存资源,二是原始表中的索引不容易被使用到(特别是聚合时)。因此,尽量减少中间表的使用是提升性能的一个重要方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值