再說索引與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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cluster factor對執行計劃的影響
- MySQL null值儲存,null效能影響MySqlNull
- Oracle優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 【MySQL】MySQL的執行計劃及索引優化MySql索引優化
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- NOT IN子查詢中出現NULL值對結果的影響你注意到了嗎Null
- mysql 執行計劃索引分析筆記MySql索引筆記
- 【C#】-對於Null值的處理方法C#Null
- oracle點陣圖索引對DML操作的影響Oracle索引
- TiDB與MySQL的SQL差異及執行計劃簡析TiDBMySql
- 建了索引執行計劃會有區別了索引
- 理解索引:MySQL執行計劃詳細介紹索引MySql
- return與finally的執行順序的影響(skycto JEEditor)
- margin為負值對佈局的影響
- [20231024]NULL值在索引的情況.txtNull索引
- 索引與null(二):組合索引索引Null
- 索引與null(一):單列索引索引Null
- 16、MySQL Case-索引key對select count(*)的影響MySql索引
- oracle執行計劃------未走索引,隱式轉換的坑Oracle索引
- 執行計劃-1:獲取執行計劃
- 關於OPcache對Swoole影響的理解opcache
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 柱狀圖與執行計劃
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 中原地產:疫情對房地產行業的影響及應對(附下載)行業
- 全面解析Js陣列遍歷對原陣列的影響及返回值JS陣列
- dart系列之:和null說再見,null使用最佳實踐DartNull
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- [20190111]執行計劃走位與.txt
- 獨家揭秘丨GreatSQL 的MDL鎖策略升級對執行的影響SQL
- 網線的分類與對網速的影響 網線對網速影響大嗎?
- MySQL:2020 端午節隨筆(索引下探和唯一索引特殊執行計劃)MySql索引
- OKR與影響地圖,別再傻傻分不清OKR地圖
- laravel-query-builder 對於欄位 值為 null的排序方式LaravelUINull排序
- 人工智慧對於IT行業的從業者影響分析報告人工智慧行業
- 中美貿易談判對雲端計算行業的影響行業
- Linux讀寫執行許可權對目錄和檔案的影響Linux
- 數說疫情影響下的線上教育行業行業