資料型別的隱式轉換
昨天檢查程式,發現執行一條sql語句的buffer gets異常的高(看執行計劃是正常的),這個表大小10M,而且謂詞使用主關鍵字,跟蹤程式才發現,開發人員使用的繫結變數與查詢條件關鍵欄位的型別不一致。這個問題竟然隱藏這麼久,程式是第三方的,我無法修改程式碼。我想既然存在隱式轉換,如果我建立這個欄位的函式型索引是否可以暫時解決這個問題。
以下是測驗的例子:
1.建立測驗例子以及主索引。
CREATE TABLE hideconv AS
SELECT to_char(ROWNUM) cserial, all_objects.*
FROM all_objects where rownum<=10000 ;
CREATE INDEX I_hideconv_to_number_cserial ON hideconv
(to_number(cserial)) ;
CREATE INDEX I_hideconv_cserial ON hideconv
(cserial) ;
Analyze Table hideconv Compute Statistics ;
2。試驗:
set autotrace traceonly ;
select * from hideconv where cserial=100 ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=88)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HIDECONV' (Cost=1 Card=1 Bytes=88)
2 1 INDEX (RANGE SCAN) OF 'I_HIDECONV_TO_NUMBER_CSERIAL' (NON-UNIQUE) (
Cost=1 Card=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1202 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
select * from hideconv where cserial='100' ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=88)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HIDECONV' (Cost=1 Card=1 Bytes=88)
2 1 INDEX (RANGE SCAN) OF 'I_HIDECONV_CSERIAL' (NON-UNIQUE) (Cost=1 Car
d=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1202 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
結論:可見建立一個to_number的函式索引解決這個問題是可行的。當然最終的結果是修改程式。
以下是測驗的例子:
1.建立測驗例子以及主索引。
CREATE TABLE hideconv AS
SELECT to_char(ROWNUM) cserial, all_objects.*
FROM all_objects where rownum<=10000 ;
CREATE INDEX I_hideconv_to_number_cserial ON hideconv
(to_number(cserial)) ;
CREATE INDEX I_hideconv_cserial ON hideconv
(cserial) ;
Analyze Table hideconv Compute Statistics ;
2。試驗:
set autotrace traceonly ;
select * from hideconv where cserial=100 ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=88)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HIDECONV' (Cost=1 Card=1 Bytes=88)
2 1 INDEX (RANGE SCAN) OF 'I_HIDECONV_TO_NUMBER_CSERIAL' (NON-UNIQUE) (
Cost=1 Card=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1202 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
select * from hideconv where cserial='100' ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=88)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'HIDECONV' (Cost=1 Card=1 Bytes=88)
2 1 INDEX (RANGE SCAN) OF 'I_HIDECONV_CSERIAL' (NON-UNIQUE) (Cost=1 Car
d=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1202 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
結論:可見建立一個to_number的函式索引解決這個問題是可行的。當然最終的結果是修改程式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-82808/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 隱式資料型別轉換JavaScript資料型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 資料型別隱式轉換導致的阻塞資料型別
- JavaScript隱式型別轉換JavaScript型別
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- C語言的隱式型別轉換C語言型別
- 如何實現隱式型別轉換型別
- c++隱式型別轉換存在的陷阱C++型別
- 建構函式定義的隱式型別轉換函式型別
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- 資料型別,型別轉換資料型別
- 徹底理解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 資料型別
- JavaScript資料型別轉換總結JavaScript資料型別