ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【SQL】IS NOT NULL条件走索引 试验

【SQL】IS NOT NULL条件走索引 试验

原创 Linux操作系统 作者:chicheng_cn421 时间:2011-11-01 13:02:19 0 删除 编辑

在论坛上看到了一个主题,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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-03-05

  • 博文量
    261
  • 访问量
    417501