oracle的优化器会自动根据统计的数据对表连接顺序进行调整。
看oracle的文档。

解决方案 »

  1.   

    优化器一节的部分内容:
        ....
        如果OPTIMIZER_MODE=COST,则激活基于成本的优化器(CBO),它使用ANALYZE语句来生成数据库对象的统计数据,这些统计数据包括表的行数,平均长度及索引中不同的关键字数等,基础工业这些统计数据,成本优化器可以计算出可获得的执行路径的成本,并选择具有最小的成本执行的路径,在CBO模式下,要经常运行ANALYZE命令来确保数据的准确性.
        如果OPTIMIZER_MODE=CHOOSE,则在表被分析的情况下激活基于成本的优化器,但当一个查询分析的表是未被ANALYSE分析统计过的时候,CBO优化器就决定进行全表扫描操作. 所以为了减少可能的全表扫描,应该尽量避免使用OPTIMIZER_MODE=CHOOSE的选项.--楼主从哪里可以看出sql是从右往左解析的呢?
      

  2.   

    基于RULE和基于COST的优化器在优化的时候有不同的,前者是按照一系列的语法规则来推测可能执行路经和比较可替换的可执行路经/
      

  3.   

    dinya2003(OK)兄,是在哪里找到这些中文文档的?
      

  4.   

    好像就是根据performance tuning翻译的。
      

  5.   

    从右往左和从左往右可以直接从expain plan看出来。
    dinya2003,你的资料不是很准确,首先应该就没有OPTIMIZER_MODE = COST 这种说法,
    另外,没有analyze的表也不会全表扫描,另外CHOOSE模式是Oracle推荐使用的,这个
    资料上说的太不正确了。不知道哪位有过具体的优化经验,能发表下高见
      

  6.   

    如果你的表从没有经过analyze,oracle只能使用Rule方式,这样的话,语句的执行路径将会不变,如果你的程序没有复杂的SQL。那没问题,如果有复杂的SQL,并且每个表都有多个索引的话就有很大的问题了,可能会产生联表查询时用到了低效的索引。如果你从没有做过analyze,而系统一直很好的运行,你可以一直不做analyze。
      

  7.   

    同意:dinya2003(OK) 的看法!
      

  8.   

    tyrone98 我想请问在未analyze的时候是用的Rule方式吗?我发现数据库在跑了一定的时间后复杂查询语句的explain plan中显示的解析顺序变了,而且似乎用上了很多hash join,这些hash join 的基表都是常用表,而不是查询语句所显示的表的顺序,也不是记录最小的表。Oracle似乎根据表的使用程度将常用表缓冲到内存中,然后对查询语句进行了优化。这一点让我觉得很兴奋,但也有些不解。
        另外,现在觉得Oracle真是很强大,数据库在跑了一定时间后能越跑越快。
      

  9.   

    如果从未做过话,就使用Rule,只要做过analyze就不一定了.
      

  10.   

    <<Oracle Performance Tuning and Optimization>>这本书,我这里也有,但是WEB格式的,bzszp(www.bzszp.533.net)兄完整的看过这本书吗?觉得这么书怎么样? 国内很多"专家"的书好象都参考了这本书. 弟兄们觉得这本英文版的书如何? 呵呵...
      

  11.   

    to hollyzp(大树)兄,    在我看这本书的时候也一样的觉得不知所措.后来查了相关资料.也不得而知(毕竟相关资料太多,也杂) , 再后来看了SQL性能优化方面的一些资料,并做了测试, 一些结果并不是所预料的或所想的那样. 我用了相当的时间来做SQL性能优化,但是对Optimization这块还是不敢发言,只是把"专家"的意见拿出来大家可以参考一下. 欢迎兄弟姐妹们继续探讨....
      

  12.   

    to dinya2003 
        我最近也在做一些性能优化的工作,和看一些相关的书,希望能了解其中的一些规律,无奈接触的知识还过少,虽然规则了解一二,不过仍旧似乎不可把握,希望能够一起探讨这方面的知识。