再說索引與Null值對於Hints及執行計劃的影響
今天看了大師eygle的《索引與Null值對於Hints及執行計劃的影響》一文,受益頗多,連結如下
http://www.eygle.com/archives/2006/02/index_null_hints_explain.html
只是有些地方感覺說的不是太清楚,我認為有必要總結出來。以下是用到的表。
SQL> create table scott.t as select username,password from dba_users;
Table created.
SQL> conn scott/tiger;
SQL> create index idx_t on t(username);
Index created.
由於B*Tree索引不儲存Null值,所以在索引欄位允許為空的情況下,某些Oracle查詢不會使用索引.這裡說的某些Oracle查詢就是不帶where條件,或者帶where條件,但是where條件不包含索引欄位的。很多時候,我們看似可以使用全索引掃描(Full Index Scan)的情況,可能Oracle就會因為Null值的存在而放棄索引.
比如對於sql語句:select /*+ index(t,idx_t) */ * from t;
如果table t 的username欄位有not null約束,加Hints就會用到索引,如果username欄位沒有not null約束(允許為空),加了Hints也用不到索引:
SQL> desc t;
Name Null? Type
----------------------------------------- -------- ----------------------------
USERNAME NOT NULL VARCHAR2(30)
PASSWORD VARCHAR2(30)
SQL> set autotrace trace explain
SQL> select /*+ index(t,idx_t) */ * from t;
Execution Plan
----------------------------------------------------------
Plan hash value: 6977672
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| TT | 1 | 15 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT | 3 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
SQL> select /*+ index(t,idx_t) */ * from t;
Execution Plan
----------------------------------------------------------
Plan hash value: 264906180
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 90 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 6 | 90 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
is null條件當然是不查B*Tree索引的,Bitmap索引則可以,where字句中沒有索引欄位的也不會用到索引。其他情況是可以用到索引的,不管索引列是否是not null的,也不管你是否指定了Hints。
比如以下這兩條語句都會查B*Tree索引的:
SQL> select /*+ index(t,idx_t) */ * from t where name='beijing';
SQL> select * from t where name='beijing';
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8554499/viewspace-578198/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 索引及排序對執行計劃的影響索引排序
- not-null約束對執行計劃的影響Null
- oracle cardinality對於執行計劃的影響Oracle
- cluster factor對執行計劃的影響
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- hive NULL值影響HiveNull
- Oracle優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- 資料列not null對索引影響一例Null索引
- 實驗-資料分佈對執行計劃的影響.txt
- _complex_view_merging對執行計劃的影響View
- NULL 值與索引Null索引
- MySQL null值儲存,null效能影響MySqlNull
- CLUSTERING_FACTOR影響執行計劃
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- 引數Optimizer_index_cost_adj 對執行計劃的影響Index
- 關於索引的執行計劃記載索引
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- NULL 值與索引(二)Null索引
- 收集統計資訊中的no_invalidate選項對執行計劃的影響
- shrink 與rebuild對索引高度的影響對比Rebuild索引
- 【MySQL】MySQL的執行計劃及索引優化MySql索引優化
- 【Oracle】-【ROWNUM與索引】-索引對ROWNUM檢索的影響Oracle索引
- 不等號影響執行計劃的相關實驗
- 【Oracle】-【COMMIT對索引的影響】-從trace看COMMIT對索引的影響OracleMIT索引
- shrink 操作對索引的影響索引
- Update操作對索引的影響索引
- 分割槽表中的區域性分割槽索引及全域性索引與執行計劃索引
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- Oracle 索引和執行計劃Oracle索引
- mysql索引和執行計劃MySql索引
- 影響執行計劃之oracle sql baseline與sql profile之互動OracleSQL
- 索引裡的NULL值與排序小記索引Null排序
- 表挪動儲存空間後,對之上的sql的執行計劃的影響的探究SQL
- 【sql調優之執行計劃】使用hint(四)Hints for JoinSQL
- 對列進行連線操作會影響索引的使用索引
- 分割槽索引(Partition Index)與SQL執行計劃(中)索引IndexSQL
- 分割槽索引(Partition Index)與SQL執行計劃(下)索引IndexSQL
- 分割槽索引(Partition Index)與SQL執行計劃(上)索引IndexSQL