优化sql的总体思路,就是要减少、降低sql的IO访问、逻辑读、物理读。
具体落实下来,大致有5个步骤:
1、索引
如果返回的数据量相对较小(一般不超过10万条数据)通过索引,可以让sql在执行时,只访问需要的数据,减少表扫描,效果非常好,有时性能可以提高千倍,
而且相对后面的方法来说,修改成本是比较低的。
2、更新统计信息
如果索引已经有了,但是经常出现执行计划中不用索引,或者用了不恰当的索引,那么,最好更新一下统计信息,因为随着时间的推移,业务的进行,
表里的数据是会不断的变化的,虽然数据库都有自动更新统计信息的机制,但这个机制不够智能,还是需要人来干预,主动更新统计信息。
3、并行
如果返回的数据量较大(几十万、百万),可以设置sql并行执行,原来是单线程执行这个sql,现在变成了多个线程来执行sql,速度会明显提高。
从优化思路上说,就是投入更多资源来做任务,而且和IT项目上有很多共同点。
比如,公司接了个项目,这个项目评估工作量是1000人天,
原来公司有50个开发,有40个开发在开发、维护其他项目,现在只有10个人可以投入开发,那么把人天除以10个人,就是要100天才能完成任务,
于是公司有新招聘10人,于是工作量除以20人,就是50天,大概就是2个月,从预估的时间上是明显缩短了,但是由于人多了,
管理、沟通、培训、新人熟悉工作的成本增加了,所以效率实际上并不会有线性的增长。
回到SQL并行执行的问题,如果线程成从1个变成了4个,执行时间并不会减少为原来的4分之1,
因为线程之间也要通信,也会有有的线程执行快,有的执行慢,会有相互等待的情况出现。
4、查询提示
通过分析执行计划,有时候发现执行计划并不是如我们所想的那样,而且实际执行速度不理想,比如:一个典型的例子是建了索引,也更新了统计信息,
执行计划就是不用这个索引,这种情况下可以尝试加查询提示,常用的有:改变关联算法、访问索引的方法、改变group by算法等。
5、改写、简化SQL
sql运行速度很慢,创建索引不起效果,加查询提示也没用,统计信息也是最新的,这个时候如果代码写的很乱,很繁杂,那可以考虑改写、简化sql。
现在很多公司都没有专门写sql的开发型DBA,一般都是由开发人员来写的,而项目又很紧,所以导致写出来的sql,性能上有很大的问题。
如果要改写sql,不管是自己写的还是别人写的,都需要先了解下业务,然后:
去掉不用关联的表。
把子查询改成join。
......
这个太多了,就不细写了。