1. 把有NULL值的列与一个常数,或者一个带有not null约束的列一同索引
create index ind_01 on t01(col01,1);
或者
create index ind_01 on t01(col01,col02); --col02 必须带有NOT NULL约束.
下面是例子:
CREATE
TABLE TAB (COL1 NUMBER, COL2 NUMBER NOT NULL);
INSERT
INTO TAB SELECT CASE WHEN ROWNUM<=10 THEN NULL ELSE OBJECT_ID END,OBJECT_ID
FROM ALL_OBJECTS;
create
index testx on tab(col1,col2);
EXEC
DBMS_STATS.GATHER_TABLE_STATS(USER,‘TAB‘);
SELECT
* FROM TAB WHERE COL1 IS NULL;
Execution
Plan
----------------------------------------------------------
Plan
hash value: 546044058
--------------------------------------------------------------------------
|
Id | Operation |
Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------
|
0 | SELECT STATEMENT | |
1 | 9 |
1 (0)| 00:00:01 |
|* 1
| INDEX RANGE SCAN| TESTX | 1 |
9 | 1 (0)| 00:00:01
|
--------------------------------------------------------------------------
Predicate
Information (identified by operation id):
---------------------------------------------------
1 - access("COL1" IS NULL)
2. 把一个例上面的NULL值进行索引,非NULL值不索引,这样建立的索引会非常小,查询效率很高.
但是在写SQL的时候,需要注意谓词条件必须与函数一致.
create index ind_01 on t01(decode(col01,null,1,null));
第一种方法适合用在除了NULL,其它的值也要用索引的情况。
第二种方法适用用在只对NULL值会用到索引,所以这个索引会很小。
END-
原文:http://www.cnblogs.com/princessd8251/p/3550471.html