的查询转换规则,会先对子查询内联视图做解析,或者子查询展开后条件为where to_number(data) = 22 and data_type='zip';,如实验语句2,但仅仅是猜测。3. 9i下,如果表有统计信息,或者alter session设置session级优化器模式为CBO,如MOS中提到的“The CBO's function is to generate execution plans that satisfy the query in the most optimal way it can.”,实验语句3指出CBO下,对谓词顺序进行了调整,先使用data_type='zip'过滤,然后再执行to_number()。4. 9i下的CBO,如实验语句4,MOS中提到“That means views often get merged into the main query and so the order in which predicates are eva luated is not under your control”,从现象看先解析to_number(),导致报错。猜测做了子查询展开,谓词条件是where data_type='zip' and to_number(data) = 22,但从10053中,没有看到原因。5. 11g,优化器默认模式是CBO,会对谓词顺序进行调整,和9i下CBO的效果相同,如实验语句5。6. 同样,没有收集表统计信息的前提下,实验语句6可正常执行。7. @dbsnake提过Oracle 10g及其以后的版本中,Oracle会对某些类型的查询转换计算成本,只有当等价改写SQL的成本值小于未经过查询转换的原始SQL的成本值时,Oracle才会对目标SQL执行这些查询转换。收集表统计信息后,实验语句5依旧可以正常执行,会按照先解析data_type='zip',后解析to_number()的方式进行,不会报错。但实验语句6再次执行后出现错误,发现谓词条件变为先解析to_number(),所以报错,猜测收集统计信息后,实验语句6的执行成本发生了变化,导致前后使用了不同的执行路径,收集统计信息后,实验语句6成本值低的执行路径,因为谓词先解析了to_number(),导致报错。但从10053上未看出端倪。
虽然上述还有一些猜疑,暂时无从考证,但至少从这篇文章中学习了以下内容:1. 不同版本RBO和CBO的使用,以及对执行SQL的影响。2. explain plan for观察查询语句谓词顺序的变化。3. 10053查看执行计划的成本选择。
|