基于CBO的SQL优化
应用程序的优化分为很多方面,如硬件,数据库配置,网络宽带等等。这里我们只讨论,如何基于ORACLE 10G数据库(使用CBO优化器),写出最有效率的SQL语句。
CBO介绍:
基于成本的优化器(Cost-Based Optimization)
★计算各种可能的“执行计划”的Cost,从中选择Cost最低的执行方案,作为实际运行方案。
CBO限制:当检索的表达到一定数量之后,就不会有以上特点。
RBO介绍:
基于规则的优化器(Rule-Based Optimization)
★只认规则,对数据不敏感,在Oracle 10g中已被完全取代。
SQL语句优化有以下几个要点:
1.减少对表的检索
2.使用索引
3.减少解析
常用工具:
1.Explain Plan
2.SQL Trace
3.tkprof
1.减少对表的检索
- 子查询
- 去除不必要的条件和数据源
- EXISTS 和 IN,谁更合适?
- 避免使用函数处理索引列
- 避免对索引列计算
- 使用基于函数的索引
- 使用HINT
2.使用索引
- 索引也是需要开销的,所以并不一定要使用索引。
- 对于数据量较大的表,尽量 使用索引。
- 程序在UT阶段由于没有实际环境,所以不要使用HINT。
3.减少解析
-
共享池(Shared Pool)
对于已经运用过的SQL语句,Oracle数据库会将信息存到共享池中,再执行相同的SQL语句时就可以不用再解析了。
原则上,Oracle数据库不会去利用不一样的SQL,哪怕仅仅是多出一个空格,或者大小写的区别。所以为了提高SQL的再利用率,要彻底的遵守编码规范。 -
使用动态SQL