ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 再说索引与Null值对于Hints及执行计划的影响

再说索引与Null值对于Hints及执行计划的影响

原创 Linux操作系统 作者:zhanglincon 时间:2009-03-25 01:11:43 0 删除 编辑

今天看了大师eygle的《索引与Null值对于Hints及执行计划的影响》一文,受益颇多,链接如下
http://www.eygle.com/archives/2006/02/index_null_hints_explain.html

只是有些地方感觉说的不是太清楚,我认为有必要总结出来。以下是用到的表。

SQL> create table scott.t as select username,password from dba_users;

Table created.

SQL> conn scott/tiger;


SQL> create index idx_t on t(username);

Index created.

        由于B*Tree索引不存储Null值,所以在索引字段允许为空的情况下,某些Oracle查询不会使用索引.这里说的某些Oracle查询就是不带where条件,或者带where条件,但是where条件不包含索引字段的。很多时候,我们看似可以使用全索引扫描(Full Index Scan)的情况,可能Oracle就会因为Null值的存在而放弃索引.

比如对于sql语句:select /*+ index(t,idx_t) */ * from t;
如果table t 的username字段有not null约束,加Hints就会用到索引,如果username字段没有not null约束(允许为空),加了Hints也用不到索引:

SQL> desc t;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(30)
 PASSWORD                                           VARCHAR2(30)

SQL> set autotrace trace explain

SQL> select /*+ index(t,idx_t) */ * from t;

Execution Plan
----------------------------------------------------------
Plan hash value: 6977672

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |     1 |    15 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| TT     |     1 |    15 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TT |     3 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

SQL> alter table t modify (username null);Table altered.

SQL> select /*+ index(t,idx_t) */ * from t;

Execution Plan
----------------------------------------------------------
Plan hash value: 264906180

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     6 |    90 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T   |     6 |    90 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

is null条件当然是不查B*Tree索引的,Bitmap索引则可以,where字句中没有索引字段的也不会用到索引。其他情况是可以用到索引的,不管索引列是否是not null的,也不管你是否指定了Hints。

比如以下这两条语句都会查B*Tree索引的:

SQL> select /*+ index(t,idx_t) */ * from t where name='beijing';

SQL> select * from t where name='beijing';

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8554499/viewspace-578198/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-03-24

  • 博文量
    79
  • 访问量
    206872