關於ORACLE隱式轉換後效能問題

2022-02-01 08:24:51 字數 960 閱讀 2419

select tm.money_code from t_contract_master t,t_money tm where t.money_id = tm.money_id and t.policy_code = ?

問題出現:

今兒生產**效能掃瞄這段指令碼被揪出來了,原因是這玩意兒執行時間過長,把後面的**兄弟都給堵住了,然後發現這傢伙在做全表掃,一

開始納悶,這不對啊,t.policy_code上面明明白白的建這索引呢,咋就能全表掃呢,既然會全表掃導致效能下降,那為什麼開發環境沒有

發現問題呢?然後,猛的一拍腦袋,乖乖,完了開發資料庫跟生產庫完全不是乙個數量級,雖說有時候資料分布會影響oracle的執行計畫,不

過我覺得還是先去看看開發庫的執行計畫是不是跟生產一樣,好訊息是,結果完全一致,我是說執行計畫完全一致,壞訊息是,開發庫量小,

看不出問題,生產庫就不妙了,看著像是要執行幾百年才能執行完成的節奏啊。

解決方案:

定位問題,為什麼建立了索引但是為什麼沒有走索引?這裡關鍵的一點其實我沒有有說明,policy_code這玩意兒是varchar2類

型,而傳入引數卻是number,那麼問題來了,碰到這種情況oracle會做隱式轉換,規則是左邊轉成右邊或者右邊轉成左邊又或者左邊右邊

一起轉巴拉巴拉,結果是執行沒有問題,但是索引就不走了。

所以呢,為了走索引,就得避免oracle發生隱式轉換,就得保持資料型別一直,在所以呢,以後如果碰到明明是number型別的資料確

被放在vachar2型別的字段上,請在查詢的時候加上引號。

select tm.money_code from t_contract_master t,t_money tm where t.money_id = tm.money_id and t.policy_code = 『123456』

好了,咱得去處理生產問題了,哎,晚上又得加班上生產。。。所以說,小夥子,做事得仔細!

ORACLE隱式型別轉換

隱式轉換問題 oracle 中的隱式轉換說明,如果資料庫中字段是字元型別,但是我們在查詢是直接給數值,系統一般不會報錯,但是如果其中儲存了非數值字元,則會報錯,舉例說明 select from table name where flag 1 flag 欄位是字元,如果資料庫中flag對應的值都是 1...

關於隱式型別轉換

cat a.cpp include include int main str1 0 0xf0 str1 1 0x00 先整型提公升 再隱式轉換 char int long long num str1 0 8 str1 1 printf ld n num printf x n num 先強制型別轉換 ...

關於MySQL隱式轉換

一 如果表定義的是varchar欄位,傳入的是數字,則會發生隱式轉換。1 表ddl 2 傳int的sql 3 傳字串的sql 仔細看下表結構,rid的字段型別 而使用者傳入的是int,這裡會有乙個隱式轉換的問題,隱式轉換會導致全表掃瞄。把輸入改成字串型別,執行計畫如下,這樣就會很快了。此外,還需要注...