高效的SQL(隱式轉換導致不走索引)
高效的SQL(隱式轉換導致不走索引)
1、建立實驗表doudou,索引建立在varchar2型別的id列上,索引名DOUDOU_INDEX
doudou@TEST> select count(*) from doudou;
COUNT(*)
----------
1000
doudou@TEST> select index_name,table_owner,table_name,TABLE_TYPE, PCT_FREE,BUFFER_POOL,TEMPORARY from user_indexes where table_name='DOUDOU';
INDEX_NAME TABLE_OWNE TABLE_NAME TABLE_TYPE PCT_FREE BUFFER_POOL TE
-------------------- ---------- ---------- ---------------------- ---------- -------------- --
DOUDOU_INDEX DOUDOU DOUDOU TABLE 10 DEFAULT N
2、開啟執行計劃,並執行2不同的SQL,並觀察執行計劃
doudou@TEST> set timing on
doudou@TEST> set autot on
doudou@TEST> select id from doudou where id=3;
ID
----------------------------------------
3
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 845489848
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| DOUDOU | 1 | 12 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("ID")=3)
【這裡有to_number的轉換,導致沒有走索引,所以,編寫高效的SQL也要注意索引列的型別,不要讓資料庫幫你隱式轉換。隱式轉換之後不走索引。】
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
314 recursive calls
0 db block gets
58 consistent gets
0 physical reads
0 redo size
404 bytes sent via SQL*Net to client
400 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
6 sorts (memory)
0 sorts (disk)
1 rows processed
doudou@TEST> select id from doudou where id='3';
ID
----------------------------------------
3
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 3961861220
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| DOUDOU_INDEX | 1 | 12 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("ID"='3')
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
9 recursive calls
0 db block gets
14 consistent gets
0 physical reads
0 redo size
404 bytes sent via SQL*Net to client
400 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
總結:
編寫SQL的時,where語句中過濾條件中請注意索引列的型別,不要讓oracle做隱式轉換,因為隱式轉換是不走索引的。
附表:
實驗環境
sys@TEST> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 – Production
sys@TEST> show parameter optimizer_mode
NAME TYPE VALUE
------------------------------------ ---------------------- --------------------------
optimizer_mode string ALL_ROWS
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26442936/viewspace-750131/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【隱式轉換】注意隱式轉換將導致索引無法使用索引
- Oracle隱式型別轉換導致索引失效Oracle型別索引
- 一次oracle sql調優的經歷(隱士轉換導致索引失效)OracleSQL索引
- [] == ![],走進==隱式轉換的世界
- 資料型別隱式轉換導致的阻塞資料型別
- sql隱式轉換SQL
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- MySQL索引失效之隱式轉換MySql索引
- 索引關鍵字的隱式轉換分析索引
- 索引失效系列——隱式型別轉換索引型別
- sql最佳化-錯誤強制型別轉換導致索引失效SQL型別索引
- 隱形轉換導致全表掃描案例
- 相容模式下導致數值型別發生隱式轉換,SQL在生產上無法正常使用案例模式型別SQL
- oracle執行計劃------未走索引,隱式轉換的坑Oracle索引
- js顯式轉換和隱式轉換JS
- javascript 隱式轉換JavaScript
- Oracle 隱式轉換Oracle
- java隱式轉換Java
- Scala - 隱式轉換和隱式引數
- Scala隱式轉換與隱式引數
- 一條主鍵索引SQL導致的CPU被打滿索引SQL
- SQL Server中提前找到隱式轉換提升效能的辦法SQLServer
- Scala Essentials: 隱式轉換
- 利用函式索引,最佳化因cluster factor過高導致不走索引一例函式索引
- 淺談MySql整型索引和字串索引失效或隱式轉換問題汊叄MySql索引字串
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- scala中隱式轉換之隱式轉換呼叫類中本不存在的方法
- [轉帖]見識一下SQL Server隱式轉換處理的不同SQLServer
- JavaScript隱式型別轉換JavaScript型別
- mysql隱式轉換問題MySql
- MySQL 隱式型別轉換MySql型別
- 【C++】禁止隱式轉換C++
- MySQL 因資料型別轉換導致執行計劃使用低效索引MySql資料型別索引
- 不當編寫SQL語句導致系統不安全(轉)SQL
- 不當編寫SQL語句導致系統不安全 (轉)SQL
- Spark中的三種隱式轉換Spark
- 你所忽略的js隱式轉換JS
- MySQL和Oracle中的隱式轉換MySqlOracle