关于SQL的执行计划。

C、语句级别
这些需要用到Hint,比如:
SQL> SELECT /*+ RULE */ a.userid,
2 b.name,
3 b.depart_name
4 FROM tf_f_yhda a,
5 tf_f_depart b
6 WHERE a.userid=b.userid;

4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ?

A、不走索引大体有以下几个原因
♀你在Instance级别所用的是all_rows的方式
♀你的表的统计信息(最可能的原因)
♀你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。

B、解决方法
♀可以修改init<SID>.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint.
♀删除统计信息
SQL>analyze table table_name delete statistics;
♀表小不走索引是对的,不用调的。

5、其它相关

A、如何看一个表或索引是否是统计信息

SQL>SELECT * FROM user_tables
2 WHERE table_name=<table_name>
3 AND num_rows is not null;
SQL>SELECT * FROM user_indexes
2 WHERE table_name=<table_name>
3 AND num_rows is not null;

b、如果我们先用CBO的方式,我们应及时去更新表和索引的统计信息,以免生形不切合实的执行计划。

SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;

具体的ANALYZE语句请参照Oracle8i/9i 的refrence文档。
<================end of file“Oracle的优化器(Optimizer)”=====================>


下面的是我的关于一点执行计划的理解:

1。首先要启动trace的选项:
set autotrace trace eXPlain
如果出现下面的错误:

SQL>  set autotrace trace explain
SP2-0613: Unable to verify PLAN_TABLE format or existence
SP2-0611: Error enabling EXPLAIN report

那么要先运行下面的语句:
 @?/rdbms/admin/utlxplan.sql;

2。分析下面的执行计划:

SQL> select ename,dname    from emp, dept   where emp.deptno=dept.deptno     and dept.dname in ('ACCOUNTING','RESEARCH','SALES','OPERATIONS');

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   NESTED LOOPS
   2    1     TABLE Access (FULL) OF 'EMP'
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

关于前面的两个数字,第一个是状态ID,第二个是父ID。
就是如下所示:0-->1-->2
                        
                         -->3-->4
在上图里,0的执行依靠1,1的执行又依赖2和3,2是没有子ID的,所以2最先执行,然后是4,在然后是3;然后2和3的结果传回1。
在这个里面0行有个字“Optimizer=CHOOSE”,这个就是上文说的那个oracle的优化器了。
还有,看这个“ INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)”,就知道这个语句运行的时候是走INDEX的。

posted on 2008-04-08 23:19 金家寶 阅读(197) 评论(0)  编辑  收藏 所属分类: oracle


只有注册用户登录后才能发表评论。


网站导航: