共計 1914 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要介紹“Oracle SQL 執(zhí)行計劃異常的處理方法”,在日常操作中,相信很多人在 Oracle SQL 執(zhí)行計劃異常的處理方法問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”O(jiān)racle SQL 執(zhí)行計劃異常的處理方法”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
現(xiàn)象:
下面語句一直以來都比較高效,執(zhí)行計劃用了索引范圍掃描后經(jīng)歷三次嵌套循環(huán),可在 2 秒內(nèi)返回結(jié)果,但今天經(jīng)同事反映卻走了 1 分多鐘!
原 SQL 語句:
Select * From (Select Rownum As Rownumber__, t.*
From (Select T1.Orderdate As OrderDate ,
T1.Status As Status ,
T1.Ordercode As OrderCode ,
T1.Sumamt As SumAmt ,
T1.Ordertype As OrderType ,
T1.Questiondesc As QuestionDesc ,
T1.Ordersource As OrderSource ,
T2.Accepter As Accepter ,
T2.City As City ,
T1.Isquestion As IsQuestion ,
T1.Issplit As IsSplit ,
T1.Salemode As SaleMode ,
T1.Stockout As StockOut ,
T2.Encmobile As EncMobile ,
T2.Encphone As EncPhone ,
Decryptbykey(T2.Mobilephone) As MobilePhone ,
T2.Province As Province ,
T3.Checkercode As CheckerCode ,
T3.Iscancel As IsCancel ,
T3.Ischeck As IsCheck ,
T3.Isclose As IsClose ,
T3.Isfinish As IsFinish ,
T1.Ischange As IsChange
From Xs_Order T1 Join Xs_Orderpsaddress T2
On T1.Ordercode = T2.Ordercode Join Xs_Orderstatus T3
On T1.Ordercode = T3.Ordercode
Order By T1.Ordercode Desc) t
Where OrderDate = :Orderdate0 And StockOut = :Stockout1) Temp
Where Rownumber__ 0and Rownumber__ = 20
后來查看執(zhí)行計劃,執(zhí)行計劃變成:
分析:
由于后面兩個表是大表,全表掃描導致大量的 IO 消耗,該語句采用了綁定變量,如果把綁定變量調(diào)整為常量后,執(zhí)行計劃正常走了索引連接,執(zhí)行后返回也是在 2 秒內(nèi)。曾經(jīng)以為是綁定變量窺探異常問題,后來把表的統(tǒng)計信息重新更新后,問題依舊,接著運行 SQL TUNNING 包,概要只建議說要啟用并行,但全表掃描并沒有消除,考慮到代價太高就放棄,于是想用 DBMS_SPM 包來載入該語句:
BASELINE:
declare
l_pls number;
begin
l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id= a0wawpy5hfrt3 ,
plan_hash_value = 2253704843, -- 注意這里的 2253704843 是我用常量帶入后正常的 PLAN_HASH_VALUE
enabled = YES
end;
執(zhí)行后,發(fā)現(xiàn)語句還是走了錯誤的執(zhí)行計劃,曾經(jīng)考慮想用捕捉基線的方式進行演化,但由于該語句帶綁定變量,會話級比較難搞,所以想到用包刪除共享池里的該執(zhí)行計劃,讓它重新進行硬解析:操作如下:
exec dbms_shared_pool.purge(0000000DE5E6B808,2332516131 , c)
–第一個參數(shù)為 v$sqlarea 中 address 和 hash_value,第二個為 cursor 類型 )
處理后執(zhí)行計劃重新產(chǎn)生,并自動應(yīng)用了 2253704843 這個執(zhí)行計劃,查詢效率正常:
到此,關(guān)于“Oracle SQL 執(zhí)行計劃異常的處理方法”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>