记录一次Oracle数据库中的sql优化
sql优化的问题之前没怎么遇到过,真实的面试中有很多sql优化的面试题,但是在实际的工作中,很少能有优化sql的机会,但是这次有一个sql优化的任务,是一个统计的功能,页面响应速度很慢,有时候还会出现无法响应的结果,看了一下整个接口,从controller层到service层再到sql语句,就是很普通的代码,中间虽然有挺多的判断,但是不至于出现这种响应时间这么长的结果,于是,我把注意力放到了sql的优化上。
一、sql优化
只写最终结果的话,确实很没意思了,还是把sql优化的一些可能方案都写一下吧,都是从网上各种博客搜索的,这里只是做了一个总结
1、explain 进行SQL语句的分析
参考链接:https://www.cnblogs.com/xuanzhi201111/p/4175635.html
2、SQL语句中的in包含的值不应该过多
3、select语句务必指明查询字段名称,避免过的的内存浪费
4、如果排序字段没有使用索引,就尽量少排序
5、如果限制条件中其他字段没有使用索引,就尽量少使用or
6、区分in和exists not in 和not exists
7、使用合理的分页方式进行分页已提高分页效率
8、分段查询
9、避免where子句中对字段进行null值判断
10、不建议使用%前缀进行模糊查询匹配
11、避免where子句对字段进行表达式操作
12、注意范围查询语句,比如between < > 会造成索引失效
13、join的优化,利用小表去驱动大表
二、最终结果方案
试了很多上上面的方案,可是从响应时间来看,并没有很好的作用,于是,只好用他们代码中的优化方案:
1 select /*+ parallel(CR,4) parallel(SR,4) */ 2 CR.EMP_NO, 3 CR.EMP_NAME, 4 SUM(CR.VALID_FLAG) validCount, 5 SUM(CR.MAJOR_FLAG) majorCount, 6 COUNT(CR.CALL_SN_NO) callCount, 7 COUNT(DISTINCT CR.UUID) srvCount 8 from A_TABLE CR 9 JOIN B_TABLE SR 10 ON SR.SRV_SN_NO = CR.CALL_SN_NO 11 group by CR.EMP_NO, CR.EMP_NAME
就是上面的parallel()函数,具体的话,参考这篇博主文章:
参考链接:https://blog.csdn.net/u012354280/article/details/16369149