關於隱式資料型別轉換的一些試驗
觀點:
1)如果欄位型別是數字型,那麼在做等值條件查詢的時候,即使=後面的值給的是字元型,也不會發生隱式資料型別轉換。
test表是我基於dba_objects建立的一張表。object_id是數值型,且是索引列,索引型別為普通索引。
以下為測試過程。
————注意Predicate Information (identified by operation id)部分,沒有發生轉換
select * from test where object_id='431'
透過v$sql得到這個語句的SQLID.
SQL> select * from table(dbms_xplan.display_cursor('6pgd93uz7vamb',null,'all'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 6pgd93uz7vamb, child number 0
-------------------------------------
select * from test where object_id='431'
Plan hash value: 3513931890
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 4
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 2 | 354 | 4
|* 2 | INDEX RANGE SCAN | TEST_IND_OBJECT_ID | 2 | | 1
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / TEST@SEL$1
2 - SEL$1 / TEST@SEL$1
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=431)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "TEST"."OWNER"[VARCHAR2,30], "TEST"."OBJECT_NAME"[VARCHAR2,128],
"TEST"."SUBOBJECT_NAME"[VARCHAR2,30], "OBJECT_ID"[NUMBER,22],
"TEST"."DATA_OBJECT_ID"[NUMBER,22], "TEST"."OBJECT_TYPE"[VARCHAR2,19],
"TEST"."CREATED"[DATE,7], "TEST"."LAST_DDL_TIME"[DATE,7],
"TEST"."TIMESTAMP"[VARCHAR2,19], "TEST"."STATUS"[VARCHAR2,7],
"TEST"."TEMPORARY"[VARCHAR2,1], "TEST"."GENERATED"[VARCHAR2,1],
"TEST"."SECONDARY"[VARCHAR2,1]
2 - "TEST".ROWID[ROWID,10], "OBJECT_ID"[NUMBER,22]
Note
-----
- dynamic sampling used for this statement
2)如果欄位型別為字元型,那麼在做等值查詢的時候,如果=後面給的是數字型的,那麼會發生隱式資料型別轉換。(注意Predicate Information (identified by operation id):部分,發生了隱式資料型別轉換TO_NUMBER("ID")=1)
X表的id欄位為字元型。
SQL> select * from x where id=1;
執行計劃
----------------------------------------------------------
Plan hash value: 2941724873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 16 | 112 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| X | 16 | 112 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("ID")=1)
Note
-----
- dynamic sampling used for this statement
1)如果欄位型別是數字型,那麼在做等值條件查詢的時候,即使=後面的值給的是字元型,也不會發生隱式資料型別轉換。
test表是我基於dba_objects建立的一張表。object_id是數值型,且是索引列,索引型別為普通索引。
以下為測試過程。
————注意Predicate Information (identified by operation id)部分,沒有發生轉換
select * from test where object_id='431'
透過v$sql得到這個語句的SQLID.
SQL> select * from table(dbms_xplan.display_cursor('6pgd93uz7vamb',null,'all'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 6pgd93uz7vamb, child number 0
-------------------------------------
select * from test where object_id='431'
Plan hash value: 3513931890
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 4
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 2 | 354 | 4
|* 2 | INDEX RANGE SCAN | TEST_IND_OBJECT_ID | 2 | | 1
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / TEST@SEL$1
2 - SEL$1 / TEST@SEL$1
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=431)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "TEST"."OWNER"[VARCHAR2,30], "TEST"."OBJECT_NAME"[VARCHAR2,128],
"TEST"."SUBOBJECT_NAME"[VARCHAR2,30], "OBJECT_ID"[NUMBER,22],
"TEST"."DATA_OBJECT_ID"[NUMBER,22], "TEST"."OBJECT_TYPE"[VARCHAR2,19],
"TEST"."CREATED"[DATE,7], "TEST"."LAST_DDL_TIME"[DATE,7],
"TEST"."TIMESTAMP"[VARCHAR2,19], "TEST"."STATUS"[VARCHAR2,7],
"TEST"."TEMPORARY"[VARCHAR2,1], "TEST"."GENERATED"[VARCHAR2,1],
"TEST"."SECONDARY"[VARCHAR2,1]
2 - "TEST".ROWID[ROWID,10], "OBJECT_ID"[NUMBER,22]
Note
-----
- dynamic sampling used for this statement
2)如果欄位型別為字元型,那麼在做等值查詢的時候,如果=後面給的是數字型的,那麼會發生隱式資料型別轉換。(注意Predicate Information (identified by operation id):部分,發生了隱式資料型別轉換TO_NUMBER("ID")=1)
X表的id欄位為字元型。
SQL> select * from x where id=1;
執行計劃
----------------------------------------------------------
Plan hash value: 2941724873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 16 | 112 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| X | 16 | 112 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("ID")=1)
Note
-----
- dynamic sampling used for this statement
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-662236/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- JavaScript 隱式資料型別轉換JavaScript資料型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 資料型別隱式轉換導致的阻塞資料型別
- JavaScript隱式型別轉換JavaScript型別
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- C語言的隱式型別轉換C語言型別
- 如何實現隱式型別轉換型別
- c++隱式型別轉換存在的陷阱C++型別
- 前端面試官必問系列之隱式型別轉換前端面試型別
- 建構函式定義的隱式型別轉換函式型別
- 資料型別,型別轉換資料型別
- 徹底理解c++的隱式型別轉換C++型別
- sql server 資料型別轉換函式SQLServer資料型別函式
- 資料型別轉換資料型別
- JS資料型別的轉換JS資料型別
- Java資料型別及型別轉換Java資料型別
- JavaScript 資料型別轉換JavaScript資料型別
- javascript資料型別轉換JavaScript資料型別
- 【Java】資料型別轉換Java資料型別
- 資料型別及轉換資料型別
- 3. php資料型別、資料型別轉換PHP資料型別
- javascript中隱私型別轉換JavaScript型別
- oracle資料隱式轉換規則Oracle
- JS裡的資料型別轉換JS資料型別
- JS 裡的資料型別轉換JS資料型別
- golang 快速入門 [8.4]-常量與隱式型別轉換Golang型別
- '2'>'10'==true? JS是如何進行隱式型別轉換的?JS型別
- 從兩個小例子看js中的隱式型別轉換JS型別
- JS中資料型別轉換JS資料型別
- 2、java資料型別轉換Java資料型別
- JavaScript 基本資料型別轉換JavaScript資料型別
- 關於資料隱私的文化轉變
- js資料型別間的互相轉換JS資料型別
- scala和java資料型別轉換Java資料型別
- go語言資料型別轉換Go資料型別
- Python3 資料型別轉換Python資料型別
- Java資料型別自動轉換(++ ,+=)Java資料型別
- python 與 Mysql 資料型別轉換PythonMySQL 資料型別