优化SQL的另一种思维6 其它注意事项
优化SQL的另一种思维系列文章是作者用了快一年的时间完成的SQL优化文章,它的原理实际上是通过分析SQL语句的执行计划来实现对整体SQL进行优化的,这是多年项目经验的总结,由于考虑到目前国内的Oracle部署还基本维持在Oracle 8 和Oracle 9的水平上,所以里面的模拟环境都是在Oracle 8.3下进行的,希望可以针对性更强一些。本文是系列连载的第六章:其它注意事项。
《优化SQL的另一种思维》目录
五、ORACLE的执行计划
七、整体实例分析
【IT专家网独家】
1. 不要认为将optimizer_mode参数设为rule,就认为所有的语句都使用基于规则的优化器
不管optimizer_mode参数如何设置,只要满足下面3个条件,就一定使用CBO。
1) 如果使用Index Only Tables(IOTs), 自动使用CBO.
2) Oracle 7.3以后,如果表上的Paralle degree option设为>1,
则自动使用CBO, 而不管是否用rule hints.
3) 除rlue以外的任何hints都将导致自动使用CBO来执行语句
总结一下,一个语句在运行时到底使用何种优化器可以从下面的表格中识别出来,从上到下看你的语句到底是否满足description列中描述的条件:
| Description 对象是否被分析 优化器的类型 ~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~~~~ Non-RBO Object (Eg:IOT) n/a #1 Parallelism > 1 n/a #1 RULE hint n/a RULE ALL_ROWS hint n/a ALL_ROWS FIRST_ROWS hint n/a FIRST_ROWS *Other Hint n/a #1 OPTIMIZER_GOAL=RULE n/a RULE OPTIMIZER_GOAL=ALL_ROWS n/a ALL_ROWS OPTIMIZER_GOAL=FIRST_ROWS n/a FIRST_ROWS OPTIMIZER_GOAL=CHOOSE NO RULE OPTIMIZER_GOAL=CHOOSE YES ALL_ROWS |
#1 表示除非OPTIMIZER_GOAL 被设置为FIRST_ROWS ,否则将使用ALL_ROWS。在PL/SQL中,则一直是使用ALL_ROWS
*Other Hint 表示是指除RULE、ALL_ROWS 和FIRST_ROWS以外的其它提示
2) 当CBO选择了一个次优化的执行计划时, 不要同CBO过意不去, 先采取如下措施:
a) 检查是否在表与索引上又最新的统计数据
b) 对所有的数据进行分析,而不是只分析一部分数据
c) 检查是否引用的数据字典表,在oracle 10G之前,缺省情况下是不对数据字典表进行分析的。
d) 试试RBO优化器,看语句执行的效率如何,有时RBO能比CBO产生的更好的执行计划
e) 如果还不行,跟踪该语句的执行,生成trace信息,然后用tkprof格式化trace信息,这样可以得到全面的供优化的信息。
- 本文关键词:

