PL/SQL Developer 的 Explain Plan Windows 在哪里,怎么用,我怎么找不到呢,谢谢!

解决方案 »

  1.   

    a) Oracle 有两种优化模式
    i. 一种是RBO(Rule Based Optimizer,基于规则的优化),采用oracle的优化规则,选择执行路径;先前Oracle优化程序使用一组固定的内在规则来优化SQL语句。当用该优化程序处理一个SQL语句是,它从该表的底部开始(假如是规则15#)向上作用,如果规则8#比规则15#有更高的优先权(因为其编号小),并假定没有更进一步的合适的的规则向优化程序提供更好的优先权来运行SQL,则它将使用8#执行查询。基于规则的优化程序所作的基本假设是,当一个SQL语句符合某个已知的规则并当改规则号越小是,执行规则被认为越好。不能确定“最小花费方法”,因为它不使用任何成本函数或统计。我们可以这样的认为:基于规则的优化程序是从前的一个运算符优先列表,而不是一个Oracle执行计划有多块的列表,你可以把它想象为一个C++或其他语言中的运算符优先给列表。
    ii. 一种是CBO(Cost Based Optimizer,基于开销/成本的优化),基于analyze,主要考虑了CPU和I/O性能。基于成本的优化程序所依据的基本关系允许在建立SQL语句的执行计划中具有更多的选项,支持产生和存储列级直方图的能力(即允许采样和存储数据分布的统计函数),还有如标识分区,并行DML,索引编排表和其他新特性。
    iii. 确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。可在SQLPLus中运行“show parameter optimizer_mode"来查看。ORACLE V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,否则选择RBO。如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。 
    iv. 我们可以采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”。 
    hint采用注释的方式,有行注释和段注释两种方式。 
    如我们想要用到A表的IND_COL1索引的话,可采用以下方式: 
      “SELECT /*+ INDEX(A IND_COL1)*/  *  FROM A WHERE COL1 = XXX;" 
      注意,注释符必须跟在SELECT之后,且注释中的“+”要紧跟着注释起始符“/*”或“--”,否则hint就被认为是一般注释,对PL/SQL语句的执行不产生任何影响。
     第八,是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxxx compute statistics for all indexes;"。ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。
    //*--------------------------------------------------------------------------------------------------------------------
    //基于规则的优化的所有规则
    级别 路径 
    1 ROWID=常数 2 唯一性索引列=常数 3 完整的唯一性组合索引=常数 
    4 完整的簇关键字=同一簇中其他表上的相应簇关键字 5 完整的簇关键字=常数 
    6 完整的非唯一性索引=常数 7 非唯一性索引=常数 8 完整的组合索引=常数 
    9 最前端的组合索引=常数 10 在BETWEEN和AND之间或使用LIKE'C%'的唯一性索引列 
    11 使用LIKE'C%' 的非唯一性索引列 12 唯一性索引列或常数 13 非唯一性索引列或常数 
    14 连接操作时得分类/合并 15 使用MAX,MIN函数的索引列 16 ORDER BY 完整的索引 
    17 全表扫描 18 未索引列=常数,或IS NULL,LIKE'%C%'