由于B*Tree索引不存储Null值,所以在索引字段允许为空的情况下,某些Oracle查询不会使用索引.
很多时候,我们看似可以使用全索引扫描(Full Index Scan)的情况,可能Oracle就会因为Null值的存在而放弃索引.
在此情况下即使使用Hints,Oracle也不会使用索引,其根本原因就是因为Null值的存在.
我们看以下测试.
在username字段为Not Null时,Index Hints可以生效.
SQL> create table t as select username,password from dba_users; Table created. SQL> desc t Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME NOT NULL VARCHAR2(30) PASSWORD VARCHAR2(30) SQL> create index i_t on t(username); Index created. SQL> set autotrace trace explain SQL> select * from t where username='EYGLE'; Execution Plan ---------------------------------------------------------- Plan hash value: 1601196873 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 34 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T | 1 | 34 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("USERNAME"='EYGLE') Note ----- - dynamic sampling used for this statement SQL> set linesize 120 SQL> select /*+ index(t,i_t) */ * from t where username='EYGLE'; Execution Plan ---------------------------------------------------------- Plan hash value: 2928007915 ------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 34 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 34 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | I_T | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("USERNAME"='EYGLE') Note ----- - dynamic sampling used for this statement |
当索引字段允许为Null时,Oracle放弃此索引:
SQL> alter table t modify (username null); Table altered. SQL> select /*+ index(t,i_t) */ * from t; Execution Plan ---------------------------------------------------------- Plan hash value: 1601196873 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 27 | 918 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| T | 27 | 918 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement |
当该字段为Not Null时,索引可以被强制使用:
SQL> alter table t modify (username not null); Table altered. SQL> select /*+ index(t,i_t) */ * from t; Execution Plan ---------------------------------------------------------- Plan hash value: 3593393735 ------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 27 | 918 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T | 27 | 918 | 2 (0)| 00:00:01 | | 2 | INDEX FULL SCAN | I_T | 27 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------ Note ----- - dynamic sampling used for this statement |
这就是Null值对于索引及查询的影响.
相关推荐
ORACLE提供了在SQL中 使用HINTS来引导优化器产生我们想要的执行计划的能力。这在多表连接、复杂查询中特别有效。HINTS的类型很多,可以设置优化器目标,可以指定表连接的顺序,可以指定使用哪个表的哪个索引等等,...
Oracle实验的sql语句执行计划,以及用hints进行语句级干预
Hints优化.pdf
1. 掌握执行计划 2. 掌握判断SQL优劣的基本能力 3. 在合适的时候用合适的Hints
hints 使用的好的話很好用。在进行sql执行过程中,由于有时候系统自动优化的方式并不是最优的。需要我们手工添加hint来提高查询效率。
Oracle Hints 用法大全,对于优化 SQL 很有帮助!
Oracle的hints调整机制介绍 Oracle的hints调整机制介绍 Oracle的hints调整机制介绍
oracle hints的详细介绍,包括各种优化算法等。
oracle HINTS用法,自己平时整理的一些关于ORACLE HINTS的用法
Spec for Extended Window Manager Hints. version 1.4 draft2
101 Helpful Hints for IELTS
maven-hints-3.1.4-sources.jar
解析Oracle Hints.解析Oracle Hints.
第1章 性能调整综述 第2章 有效的应用设计 第3章 SQL语句处理的过程 第4章 ORACLE的优化器 第5章 ORACLE的执行计划 访问路径(方法) -- ... 如何干预执行计划 - - 使用hints提示 具体案例分析 第6章 其它注意事项
例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描。在Oracle中,是通过为语句添加hints(提示)来实现干预优化器优化的目的。 hints是oracle提供的一...
AH1014_v1_4_Application_Hints_TJA1042_43_48_51
1.36 避免在索引列上使用IS NULL和IS NOT NULL 22 1.37 总是使用索引的第一个列 23 1.38 ORACLE内部操作 23 1.39 用UNION-ALL 替换UNION ( 如果有可能的话) 24 1.40 使用提示(HINTS) 25 1.41 用WHERE替代ORDER BY 25...
Oracle中关于hints的语义及使用情况的介绍。
Guide and Hints for Samsung BLE API.三星BLE说明文档