關於NULL
今天在最佳化sql語句的時候發現存在如下sql語句,像這樣
select * from t where object_name='' ;
發現執行計劃裡面存在全表掃描,這個問題主要在與開發人員沒有判斷輸入的條件。
自己寫了一個測試例子,如下:
1。建立表以及索引:
create table t as select * from all_objects ;
create index i_t_object_name on t(object_name);
2。分析表
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS (
OwnName => 'SCOTT'
,TabName => 'T'
,Cascade => TRUE);
END;
3.測試:
set autotrace traceonly
select * from t where object_name='' ;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 1322348184
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 128 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| T | 44358 | 5544K| 149 (3)| 00:00:02 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
913 bytes sent via SQL*Net to client
323 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
開始對consistent gets為0很不理解,實際上在filter上已經說明條件是NULL IS NOT NULL,
這個條件永遠為假。可以這個看在輸入這個條件object_name=''時,oracle將''看成NULL,
如果輸入如下條件object_name=NULL或者NULL=NULL,結果也是一樣的,這個也可以說明
oracle中NULL不等於NULL。要真正查詢NULL要寫成 select * from t where object_name
is NULL ;
在來看這個執行結果,先修改表t的object_name欄位讓它不為NULL(實際上建立T表時已經定義):
ALTER TABLE T MODIFY(object_name NOT NULL);
select * from t where object_name is NULL ;
執行計劃的filter還是,1 - filter(NULL IS NOT NULL)。
如果修改欄位屬性object_name為NULL
ALTER TABLE T MODIFY(object_name NULL);
執行計劃的變為1 - filter("OBJECT_NAME" IS NULL)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-82972/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於 oracle NULLOracleNull
- ORACLE關於NULL的總結OracleNull
- 關於NULL的兩個計算Null
- 關於null值的小知識Null
- oracle中關於null的定義OracleNull
- SQL中關於NULL的程式碼SQLNull
- SQL 語句中關於 NULL 的那些坑SQLNull
- Java--- 關於null的處理若干方法JavaNull
- 關於ResultFilter類中NULL_INT的作用????FilterNull
- 關於string.Empty & "" & null 的討論Null
- Java 中關於 null 物件的容錯處理JavaNull物件
- 關於0轉成null時資料型別Null資料型別
- 關於NULL值在索引裡的兩個疑惑Null索引
- 關於ORACLE MYSQL NOT IN和NOT exists需要注意的 NULL值OracleMySqlNull
- 關於/dev/null和/dev/zero兩個檔案裝置devNull
- 從Access轉到MySql以後遇到的關於null問題MySqlNull
- 關於 /dev/null 差點直播吃鞋的一個小問題devNull
- ((NULL) null).printNULL();((NULL) null).printnull();Null
- 和Null有關的函式Null函式
- IS NULL和IS NOT NULLNull
- 關於建表欄位是否該使用not null這個問題你怎麼看?Null
- Java中有關Null的9件事JavaNull
- not null與check is not nullNull
- 2 Day DBA-管理方案物件-關於方案物件管理許可權-NOT NULL列約束物件Null
- 了不起的 “filter(NULL IS NOT NULL)”FilterNull
- Hashtable/HashMap與key/value為null的關係HashMapNull
- 【C#】-對於Null值的處理方法C#Null
- MySQL中is not null和!=null和<>null的區別MySqlNull
- 【NULL】Oracle null值介紹NullOracle
- mysql探究之null與not nullMySqlNull
- 關於IT,關於技術
- MyBatis中對於字串blank(null、empty)的判定方法MyBatis字串Null
- Difference between 2>&-, 2>/dev/null, |&, &>/dev/null, >/dev/null, 2>&1devNull
- MySQL案例-TIMESTAMP NOT NULL與NULLMySqlNull
- NULL和唯一約束UNIQUE的對應關係Null
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- 關於vue中image控制元件,onload事件裡,event.target 為null的奇怪問題探討Vue控制元件事件Null
- null == undefined ?NullUndefined