Oracle隱式型別轉換導致索引失效
Oracle隱式型別轉換導致索引失效
隱式型別轉換就是Oracle在判斷型別是自動將varchar2型別轉換為number型別,或者將number型別轉換為varchar2型別,隱
式型別轉換必須要求是可以轉化的,比如varchar2型別的123可以轉化為number,但是abc就不可以轉換
注:隱式型別轉換number轉換成varchar2時,索引會失效。varchar2轉換為number時,索引並不失效
-- Create table
create table Z_HASH
(
ID VARCHAR2(100) primary key,
NAME VARCHAR2(100)
)
--建立儲存過程,插入資料
CREATE OR REPLACE PROCEDURE "ETL_Z_HASH_" IS
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO Z_HASH VALUES(z_hash_id.nextval,'hash-'||z_hash_id.currval);
COMMIT;
END LOOP;
end ETL_Z_HASH_;
--分析下面的語句
select * from z_hash t WHERE t.id='1573';
--'1573'為varchar2型別,沒有用到隱式型別轉換,分析結果如下:
SQL> explain plan for select * from z_hash t where t.id='200305';
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 104 | 1 (0)
| 1 | TABLE ACCESS BY INDEX ROWID| Z_HASH | 1 | 104 | 1 (0)
| 2 | INDEX UNIQUE SCAN | SYS_C0016603 | 1 | | 1 (0)
--------------------------------------------------------------------------------
12 rows selected
--可見使用了在欄位id上的索引;
select * from z_hash t WHERE t.id=1573;
--這時用到了隱式型別轉換,分析結果如下:
SQL> explain plan for select * from z_hash t where t.id=200305;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 104 | 88 (6)|
| 1 | TABLE ACCESS FULL| Z_HASH | 1 | 104 | 88 (6)|
-----------------------------------------------------------------
11 rows selected
--這時索引失效了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25261409/viewspace-1044978/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 索引失效系列——隱式型別轉換索引型別
- 【隱式轉換】注意隱式轉換將導致索引無法使用索引
- 資料型別隱式轉換導致的阻塞資料型別
- sql最佳化-錯誤強制型別轉換導致索引失效SQL型別索引
- MySQL索引失效之隱式轉換MySql索引
- 一次oracle sql調優的經歷(隱士轉換導致索引失效)OracleSQL索引
- 高效的SQL(隱式轉換導致不走索引)SQL索引
- JavaScript隱式型別轉換JavaScript型別
- MySQL 隱式型別轉換MySql型別
- ORACLE中的隱式資料型別轉換(一)Oracle資料型別
- oracle資料型別隱式轉換----- 應急方案Oracle資料型別
- C# 隱式型別轉換(轉載)C#型別
- JavaScript 隱式資料型別轉換JavaScript資料型別
- 如何實現隱式型別轉換型別
- 談談 MySQL 隱式型別轉換MySql型別
- C++隱式類型別轉換C++型別
- C++隱式型別的轉換C++型別
- C++ 隱式類型別轉換C++型別
- 資料型別的隱式轉換資料型別
- 有趣的JavaScript隱式型別轉換JavaScript型別
- JavaScript隱式型別轉換趣解JavaScript型別
- CHAR型別函式索引導致結果錯誤型別函式索引
- MySQL 因資料型別轉換導致執行計劃使用低效索引MySql資料型別索引
- 淺談MySql整型索引和字串索引失效或隱式轉換問題汊叄MySql索引字串
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- C語言的隱式型別轉換C語言型別
- JavaScript的隱式型別轉換淺析JavaScript型別
- 從Java的型別轉換看MySQL和Oracle中的隱式轉換(二)Java型別MySqlOracle
- Oracle 隱式轉換Oracle
- 淺談Oracle中隱式型別轉換規律和影響Oracle型別
- c++隱式型別轉換存在的陷阱C++型別
- 「譯」JavaScript 的怪癖 1:隱式型別轉換JavaScript型別
- 建構函式定義的隱式型別轉換函式型別
- 相容模式下導致數值型別發生隱式轉換,SQL在生產上無法正常使用案例模式型別SQL
- Mysql 會導致索引失效的情況MySql索引
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- 徹底理解c++的隱式型別轉換C++型別