關於ORACLE隱式轉換后性能問題


 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’

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM