關於NULL

lfree發表於2007-02-13

今天在最佳化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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章