对于sql优化,从实际工作经验出发,总结如下:
1)、where过滤部分,等式左边不要带任何计算和嵌套函数,想办法等价替换,在等式右边去做变动;
2)、能手动计算的部分,手动算好写上固定的值,不要写一个表达式在sql里,让程序每次去重算;
3)、3个及以上大表关联,慢到跑个30分钟都不出结果,最直接简单的方法是建一个临时表,拆分多表关联为多个2表关联的等价sql;
4)、对于非常慢的sql,可以尝试重新获取源表信息,获取新的执行计划;
5)、在实现逻辑时,对于有排序操作的关键字(order by/group by/distinct/union/等)要敏感,看看是不是在实现逻辑的同时能避免这些排序操作;
6)、避免自己写函数实现功能,应使用Oracle自带的函数;
7)、不要千篇一律的使用左连接(左连接在实现功能时,有一个好处,那就是不用管那么多,反正不会丢数据),应该站在业务的角度去分析数据,是不是一定要左连接,毕竟外连接是很耗性能的;
8)、对于大数据,可以采取分区+并行的技术,对于分区,在实现方式上,要考虑到怎么为表自动添加分区和时间久了怎样自动drop掉前面的分区;
9)、索引是把双刃剑,使用时要测试好,并能考虑到后期要手动维护、索引失效等等负面问题;
10)、强制Hint,人为改变Oracle执行计划;
11)、多分析执行计划,来判断sql的优劣,为了避免缓存的影响,将不同的测试sql均执行多次;
12)、对于sql的整体把握,一定要知道源表数据量大概为多少,最终返回的结果集会多少,不然优化无从谈起,因为所有的技术和结论都是因数据量的大小变化的;
13)、以上均为开发者在实现层面的优化,更根本的在于前期的设计和架构;
本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/