【DB筆試面試567】在Oracle中, IS NULL如何用到索引?
- 2019 年 10 月 10 日
- 筆記
♣
題目部分
在Oracle中, IS NULL如何用到索引?
♣
答案部分
IS NULL用於判斷某一列中的值是否為空。當IS NULL作為WHERE條件的時候,該列是不會用到索引的,但是可以加偽列創建偽聯合索引來使得IS NULL使用索引,看如下的例子:
SQL> CREATE TABLE TB_LHR_20160427(OBJ_ID,OBJ_NAME) AS SELECT OBJECT_ID,OBJECT_NAME FROM DBA_OBJECTS; Table created. SQL> CREATE INDEX I_TB_OBJ_ID_0 ON TB_LHR_20160427(OBJ_ID); Index created. SQL> SET AUTOT ON SQL> SELECT COUNT(*) FROM TB_LHR_20160427 WHERE OBJ_ID IS NULL; COUNT(*) ---------- 0 Execution Plan ---------------------------------------------------------- Plan hash value: 220746883 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 13 | 122 (3)| 00:00:02 | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | TABLE ACCESS FULL| TB_LHR_20160427 | 5 | 65 | 122 (3)| 00:00:02 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("OBJ_ID" IS NULL) Note ----- - dynamic sampling used for this statement (level=2) SQL> CREATE INDEX I_TB_OBJ_ID ON TB_LHR_20160427(OBJ_ID,-1); Index created. SQL> SET AUTOTRACE TRACE EXP SQL> SET LINE 9999 SQL> SELECT COUNT(*) FROM TB_LHR_20160427 WHERE OBJ_ID IS NULL; Execution Plan ---------------------------------------------------------- Plan hash value: 3872560566 --------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 13 | 13 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | INDEX RANGE SCAN| I_TB_OBJ_ID | 4 | 52 | 13 (0)| 00:00:01 | --------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJ_ID" IS NULL) Note ----- - dynamic sampling used for this statement (level=2)
& 說明:
有關NULL和索引的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2141337/
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。