oracle資料型別隱式轉換----- 應急方案

dbhelper發表於2006-12-22


mytun免費使用啦, 2014-11-8做過更新,請更新軟體, (技術支援QQ:123614791)

軟體下載地址 


《劍客》


十年磨一劍, 霜刃未曾試。
今日把示君, 誰為不平事?
  
mytun的意義:讓菜鳥變成“強人”
  

一、來北京工作:   
     和很多IT創業者一樣, 於2004年5月,我懷揣夢想來到北京,那年正好31歲。 
     那年北京,剛進入網際網路泡沫的破滅和非典, IT行業不景氣,找一份DBA的工作難度可想而知,幸好我在2003釋出一款 《ORACLE備份幫手》的軟體,有獵頭透過軟體的聯絡方式找到了我,我成功經過馮總面試後,入職慧聰網,開始了我的DBA生涯。 

二、DBA頭疼的問題:
     我於2004年上班的第一天,便被派到慧聰網參與《買賣通》的封閉開發了,開始負責SQL最佳化和結構設計最佳化,買賣通的開始從1.0到最後5.0,經歷了數不清的版本。。。,  後來在2007年香山的一次itpub的會議上,我和阿里巴巴的馮春陪大師交流時,發現大型網際網路公司每週都有新版釋出,都這樣, 哎,dba工作不是啥好活!

三、mytun想法的誕生:
    資料庫管理員(DBA)水平層次不齊。如何能高效運維?
   於是我萌生想法:開發一個快速定位問題的工具,把工具指令碼高效的整合起來,讓菜鳥都可以變成“強人”。
   mytun本含義是  "my tune"。
  於2010年,我開發完成了mytun工具,在慧聰網幾十個資料庫中測試,部署,改進。。它把我們解放了。
  於2011年我辭去了慧聰網的DBA經理職位,開始了自己的創業之路。

   慧聰網的老同事都親切的稱我:王工(wang yu qiang)QQ:123614791,  呵呵
    mytun鑑證了我十年的DBA之路, 也包含了為慧聰網而奮鬥的兄弟們身影,如今已各奔東西,你們還好嗎?

四、mytun的分享:

mytun下載(雲盤下載)
    



阿里雲linux5.7安裝oracle必讀     ]


阿里雲的oracle故障解決案例                ]


阿里雲linux安裝oracle常見問題              


阿里雲ORACLE最佳化                     ]


sql調優工具-mytun之十年磨一劍      


阿里雲資料庫遷移方案-不間斷業務   






原創 qq : 123614791
場景:
1. 資料列型別 和 輸入值 型別 不一致
2. 已有列的常規index不能被使用,訪問都是 TABLE ACCESS (FULL)。
3. 程式程式碼不能立刻修正。


解決 : 產生to_number(列)的 函式index, 卻能夠被應用, 避免一場資料庫的災難。


---------------- oracle資料隱式轉換---- 應急方案-to_number(列) 函式index-----------------------------------------------

1. 列為數值型。
where ml_id= '36837053' 可以使用 index
where ml_id = 36837053 可以使用 index

2. 列為字元型varchar2 。
var_col='36837053' 可以使用 index

where var_col= 36837053 ; 不能用上其列index

(重要:產生to_number(列)的index 卻可以被應用===》 在不能立刻改程式程式碼的情況下, 應急方案。 )



---------------------------------------- 明細測試如下-------------------------------------------------
create table TMP
(
ML_ID NUMBER(38) not null,
L_TYPE VARCHAR2(20),
OP_NAME VARCHAR2(20),
OP_ID VARCHAR2(1000),
OP_SQL VARCHAR2(1000),
PROVIDERID NUMBER(12) not null,
OPERATOR VARCHAR2(40),
OP_DATE TIMESTAMP(6),
LOG_TYPE CHAR(1),
VAR_COL VARCHAR2(40)
)


1. 當列為數值型。


select ml_id from TMP where ml_id='36837053'

select ml_id from TMP where ml_id = 36837053

create index TMP_ml_id on b_log_his200611_2(ml_id) tablespace newhcindex;


select ml_id from TMP where ml_id='36837053'
/

ML_ID
----------
36837053

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 Bytes=6)
1 0 INDEX (RANGE SCAN) OF 'TMP_ML_ID' (INDEX) (Cost=1 Card=1 Bytes=6)

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads


select ml_id from TMP where ml_id = 36837053

ML_ID
----------
36837053

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 Bytes=6 )
1 0 INDEX (RANGE SCAN) OF 'TMP_ML_ID' (INDEX) (Cost=1 Card=1 Bytes=6)


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets




2. 當列為字元型。
create table tmp as select * from b_log_his200611_2

alter table tmp add var_col varchar2(40);

update tmp set var_col = ml_id;

select ml_id, var_col from tmp

select ml_id from tmp where var_col='36837053'

create index tmp_var_col on tmp(var_col) tablespace newhcindex;


select ml_id from tmp where var_col='36837053'
/

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=10 Bytes=350)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TMP' (TABLE) (Cost=1 Card=10 Bytes=350)
2 1 INDEX (RANGE SCAN) OF 'TMP_VAR_COL' (INDEX) (Cost=1 Card=7946)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets


SQL> select ml_id from tmp where var_col= 36837053 ;
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=3 Card=10 Bytes=350)
1 0 TABLE ACCESS (FULL) OF 'TMP' (TABLE) (Cost=3 Card=10 Bytes =350)
Statistics
----------------------------------------------------------
165 recursive calls
0 db block gets
9628 consistent gets
0 physical reads

select /*+ RULE INDEX(A tmp_var_col) */ A.ml_id from tmp A where A.var_col= 36837053
/
SQL> /
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE
1 0 TABLE ACCESS (FULL) OF 'TMP' (TABLE)

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
9597 consistent gets


create index tmp_var_col_tonumber on tmp(to_number(var_col)) tablespace newhcindex;

select ml_id from tmp where var_col= 36837053
/
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=10 Bytes=350)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TMP' (TABLE) (Cost=1 Card=10 Bytes=350)
2 1 INDEX (RANGE SCAN) OF 'TMP_VAR_COL_TONUMBER' (INDEX) (Cost=1 Card=7946)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
0 physical reads


原創 qq : 123614791


[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-885715/,如需轉載,請註明出處,否則將追究法律責任。

相關文章