多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 數據庫 > 數據庫應用 > Oracle的隱式轉換

Oracle的隱式轉換

來源:程序員人生   發布時間:2015-03-17 08:31:09 閱讀次數:3377次
都說Oracle存在NUMBER和VARCHAR2類型的隱式轉換,嚴格意義上需要避免,但為什么需要避免,從下面的實驗進行驗證。

1. 創建測試表和索引
create table tn (id number, name varchar2(1));
create index idx_tn on tn (id);
create index idx_tn on tn (name);
分別對NUMBER類型的id字段,VARCHAR2類型的name字段創建索引。

2. 查看VARCHAR2->NUMBER的隱式轉換
SQL> select * from tn where id = 1;
no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 3532270966
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_TN | 1 | 13 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------
"where id = 1"用的是列索引范圍掃描。

SQL> select * from tn where id = '123';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 3532270966
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_TN | 1 | 13 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------
"where id = '123'",Oracle會將字符類型的123轉換為NUMBER類型進行比較,此處仍可以使用索引范圍掃描,說明VARCHAR2->NUMBER的隱式轉換,未對索引產生影響

3. 查看NUMBER->VARCHAR2的隱式轉換
SQL> select * from tn where name = '123';
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 479240418
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TN | 1 | 15 | 1 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TN_NAME | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
"where name = '123'"使用的是索引范圍掃描。

SQL> select * from tn where name = 123;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 2655062619
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TN | 1 | 15 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
"where name = 123",Oracle會將數值類型的123轉換為VARCHAR2字符類型,和name進行比較,此處用了全表掃描,說明name的列索引失效

總結
1. NAME和VARCHAR2之間可以進行隱式轉換,其中VARCHAR2->NUMBER不會致使索引失效,NUMBER->VARCHAR2會讓索引失效,因此這類隱式轉換,是需要注意避免。
2. 之所以VARCHAR2->NUMBER不會讓索引失效,我猜想是轉換為where id = to_number('123')。NUMBER->VARCHAR2會讓索引失效,我猜想是轉換為where to_number(name) = 123。
3. 引伸知識點,之所以上面id和name使用的是索引范圍掃描,是由于建立的是非唯1B樹索引,如果是unique索引,則會使用UNIQUE INDEX SCAN的掃描方式。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 69精品视频| 国产激情一区二区三区 | 国产精品永久免费自在线观看 | 亚洲精品乱码久久久久久v 亚洲精品乱码久久久久久蜜桃 | 乱在线伦视频免费 | 国产日韩欧美一区二区 | 久久不色| 波多野结衣手机在线视频 | 老司机一级片 | 一区二区三区精品 | 欧美精品久久 | 国产福利在线观看永久免费 | 狠久久 | 久久91久久91精品免费观看 | 久久在线综合 | 呦视频在线一区二区三区 | www视频在线看 | 久久国产精品免费 | 欧美国产成人在线 | 午夜亚洲一区二区福利 | 欧美成视频在线观看 | xxxxx欧美 | 最近手机中文字幕1 | 男人天堂网2021 | 久久精品综合一区二区三区 | 久久福利一区二区 | 91九色最新地址 | 最近最新手机中文字幕在线看 | 欧美另类高清xxxxx | 欧美国产综合日韩一区二区 | 日本动漫免费看 | 第一福利视频网 | 国产视频在线一区 | 国产极品嫩模在线观看91精品 | 免费v片在线观看 | 欧美一级毛片欧美大尺度一级毛片 | 午夜刺激 | 国产精品v欧美精品v日本精 | 国产欧美一区二区三区在线看 | 国内精品伊人久久 | v片免费观看 |