關於隱式資料型別轉換的一些試驗

wei-xh發表於2010-05-08
觀點:
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章