我想问,既然ORACLE优化器会自动选择最好的执行计划,那我们要从哪些方面来优化SQL呢(对于一个做多表连接的SQL)

解决方案 »

  1.   

    先看表结构,索引,主键等
    在看SQL数据的写法效率!
      

  2.   

    1。正确使用索引2。添加HINT提示
      

  3.   

    Oracle提供最优化的执行计划基于几个前提:
    1.硬件资源最优化配置(比如内存,CPU,IO)
    2.访问路径的选择度(比如是否提供了合适的索引)
    3.数据对象的统计特性是否准确收集
    4.系统的访问特性相对稳定(没有突变)
    在上述条件下,Oracle能提供最优的执行计划.那么优化的工作就聚焦在以上几个方面了.
    针对上面的第四点,就需要具体问题具体解决了,在查询上使用优化提示能满足特定情况下的优化需求.数据库优化,本质上来说就是有限资源的最优化配置.最优化这一部分主要由Oracle来选择,那么我们需要最的就是找到这个资源的整体上限.
      

  4.   

    SQL数据的写法效率是什么意思啊..
    做NESTED LOOP连接的时候如何知道哪个表是驱动表,会不会我的驱动表是特别大的那张表(且根据JOIN条件选择出的记录数也远多于被驱动表)
      

  5.   

    SQL本身的写法是有很大学问的,尤其在有些查询中,大量的逻辑排序操作完全不必要或可以合并,或改变排序在计划中的执行位置,能得到相同的结果,但效率可能天壤之别.
    SQL优化的一个很关键的原则就是把最繁重的工作的重复次数减到最少.
    嵌套循环NESTED LOOP的驱动表就决定了这种工作的重复次数,而内部表所使用的访问路径就决定了这个工作的繁重程度..Oracle的优化器并不是万能的.大部分时候它并不能帮你优化逻辑,它只是帮你在有限资源下最优化实现你的逻辑.
      

  6.   

    比如,你如果在查询结果中已经包含了表的primary key,且不需要排序的结果集,那么你就不要使用DISTINCT.因为那样会导致逻辑排序操作.
    其它的比如你已经GROUP BY了,在任何一个需要排序逻辑但对于特定的排序规则并不关注的地方,你完全不必要重复Order by
      

  7.   

     谢谢你热心回复
     可能我要优化我的SQL需要更改SQL的逻辑或者使用HINT提示,那最后一个问题:
     是不是PL/SQL中Explain Plan窗口中NESTED LOOP下的2个表,出现在上面的那个是驱动表?
      

  8.   

    谢谢了,客户要优化SQL,我找不到下手的地方,烦