關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java--- 關於null的處理若干方法JavaNull
- Java 中關於 null 物件的容錯處理JavaNull物件
- 關於 /dev/null 差點直播吃鞋的一個小問題devNull
- 關於建表欄位是否該使用not null這個問題你怎麼看?Null
- Hashtable/HashMap與key/value為null的關係HashMapNull
- 【C#】-對於Null值的處理方法C#Null
- 【NULL】Oracle null值介紹NullOracle
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- Linux下" >/dev/null 2>&1 "相關知識說明LinuxdevNull
- 關於vue中image控制元件,onload事件裡,event.target 為null的奇怪問題探討Vue控制元件事件Null
- PropertyChanged == nullNull
- MySQL NULLMySqlNull
- 關於IT,關於技術
- MySQL null值儲存,null效能影響MySqlNull
- 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的區別devNull
- NULL列時,如何使得IS NULL或者IS NOT NULL可以使用索引來提高查詢效率Null索引
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- 為什麼索引無法使用is null和is not null索引Null
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- null與indexNullIndex
- null 和 undefinedNullUndefined
- mssql sqlserver in 關鍵字在值為null的應用舉例SQLServerNull
- laravel-query-builder 對於欄位 值為 null的排序方式LaravelUINull排序
- 關於++[[]][+[]]+[+[]]
- 關於
- 關於~
- 面試題((A)null).fun()——java中null值的強轉面試題NullJava
- SCSS Null 型別CSSNull型別
- null in ABAP and nullpointer in JavaNullJava
- MySQL null和''分析MySqlNull
- undefined與null與?. ??UndefinedNull
- dart系列之:和null說再見,null使用最佳實踐DartNull
- MySQL NOT NULL列用 WHERE IS NULL 也能查到資料的原因MySqlNull
- 關於LaTex
- 關於索引索引
- 關於EchartsEcharts
- 關於HTMLHTML
- 關於startActivityForResult
- 關於AUC