请问一下一般我们对于SQL语句,我们可以通过ORACLE的EXPLAIN功能进行分析,对于EXPLAIN后的分析结果,我现在只知道如果cost高的话,或者没有用上索引的SQL语句是不够优化的。但后来我在开发过程中发现有时候cost值低,但是实际运行的SQL的速度也不会很快的说。请教大家下如何分析SQL语句,可以判断出这个SQL语句在未来运行过程会高效呢。对于EXPLAIN后的结果,我有所了解,公布如下,但具体怎么看这些数据,比如哪个数值大会导致SQL运行不快,有没有这样这样的衡量标准,请教大家一下,一起讨论EXPLAIN结果字段如下:
字段名              字段类型            含义
STATEMENT_ID    VARCHAR2(30)        explain PLAN 语句中所指定的最优STATEMENT_ID 参数值, 如果在EXPLAN PLAN语句中没有使用SET STATEMENT_ID,那么此值会被设为NULL。
REMARKS         VARCHAR2(80)        与被解释规划的各步骤相关联的注释最长可达80 字节
OPERATION       VARCHAR2(30)        各步骤所执行内部操作的名称在某条语句所产生的第一行中该列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
OPTIONS         VARCHAR2(30)        对OPERATION 列中所描述操作的变种
OBJECT_NODE     VARCHAR2(128)       用于访问对象的数据库链接database link 的名称对于使用并行执行的本地查询该列能够描述操作中输出的次序
OBJECT_OWNER    VARCHAR2(30)        对于包含有表或索引的架构schema 给出其所有者的名称
OBJECT_NAME     VARCHAR2(30)        表或索引的名称
OBJECT_INSTANCE  INTEGER            根据对象出现在原始original 语句中的次序所给出的相应次序编号就原始的语句文本而论其处理顺序为自左至右自外向内景象扩张view
OBJECT_TYPE     VARCHAR2(30)        用于提供对象描述性信息的修饰符例如索引的NON-UNIQUE
OPTIMIZER       VARCHAR2(255)       当前优化程序的模式
ID              INTEGER             分配给执行规划各步骤的编号
PARENT_ID       INTEGER             对ID 步骤的输出进行操作的下一个执行步骤的ID
POSITION        INTEGER             对于具有相同PARENT_ID 的步骤其相应的处理次序
COST            INTEGER             根据优化程序的基于开销的方法所估计出的操作开销值
对于使用基于规则方法的语句该列为空
该列值没有特定的测量单位
它只是一个用于比较执行规划开销大小的权重值
                                    他是根据CPU开销和IO开销为参数的函数,而计算出来的一个开 销值
CARDINALITY     INTEGER             根据基于开销的方法对操作所访问行数的估计值
BYTES           INTEGER             根据基于开销的方法对操作所访问字节的估计

解决方案 »

  1.   

    愣了一下,呵呵...好像我也是只会看cost值... :(但再深想一下,不止cost值~ 哈哈...一般本人最后才看cost值. :)  先看是否有full table scan,再看index是否被利用,然后看sort是否有用到disk,再看表的连接,是否多层循环取值,是否大量get db block, insert/delete会否产生大的redo size...等等...其实cost值只是当前机子,当前数据库的一个值而已,主要优化不只是把cost值降低,而是整个执行过程.
      

  2.   

    如果基于成本,建议在查询前分析(analyze table )一下表
    以让oracle能找到最优路径