在论坛上看到了一个主题,likgui给出了解决方案,我试验了一下,试验过程如下,记录一下。
帖子地址:
http://www.itpub.net/thread-1506807-1-1.html那位朋友的问题:---------------------------
[讨论] is not null和<>如何走索引
如题,讨论下,如何让这两种SQL条件走索引呢
------------------------------
我的当时回帖:-----------------------------
likgui 发表于 2011-10-31 21:46 
create index ind on t(col1 ,0)就可以了。
likgui 说的方案可以。
下面是我的实验过程。
建两个表,test表在CNT列上做了一个NULL的索引,testX表则CNT列上没有定义索引。
当同是执行 “where cnt is not null”条件时,test走了索引,而textX走的是全表扫描。
select * from testX where cnt is not null
select * from test where cnt is not null
【建表】
-- Create table
create table TEST
(
ID NUMBER,
CNT NUMBER,
C1 VARCHAR2(10),
C2 VARCHAR2(10)
)
;
-- Create/Recreate indexes
create index IDX_TEST on TEST (CNT, 0)
;
-- Create table
create table TESTX
(
ID NUMBER,
CNT NUMBER,
C1 VARCHAR2(10),
C2 VARCHAR2(10)
)
;
【表中数据】
SQL> select * from testx;
ID CNT C1 C2
---------- ---------- ---------- ----------
1 3 aa aaa
2 bb bbb
3 4 bb bbb
4 bb bbb
5 bb bbb
6 5 bb bbb
7 bb bbb
8 6 bb bbb
9 7 bb bbb
9 rows selected
SQL>
SQL> select * from test;
ID CNT C1 C2
---------- ---------- ---------- ----------
1 3 aa aaa
2 bb bbb
3 4 bb bbb
4 bb bbb
5 bb bbb
6 5 bb bbb
7 bb bbb
8 6 bb bbb
9 7 bb bbb
9 rows selected
SQL>
【执行计划 testX表】
select * from testX where cnt is not null
SELECT STATEMENT, GOAL = ALL_ROWS Cost=3 Cardinality=5 Bytes=200
TABLE ACCESS FULL Object wner=SCOTT Object name=TESTX Cost=3 Cardinality=5 Bytes=200
【执行计划 test表】
select * from test where cnt is not null
SELECT STATEMENT, GOAL = ALL_ROWS Cost=2 Cardinality=5 Bytes=200
TABLE ACCESS BY INDEX ROWID Object wner=SCOTT Object
name=TEST Cost=2 Cardinality=5 Bytes=200
INDEX FULL SCAN Object wner=SCOTT Object name=IDX_TEST Cost=1 Cardinality=1
------------------------------
以上。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/20335819/viewspace-710028/
,如需转载,请注明出处,否则将追究法律责任。