親愛滴伙伴們,本萎磚家又來了。這次咱說說SQL加了并行hint,但并行卻跑不起來的小案例。這事兒的起因是應用側一哥們兒反饋一個存儲過程平時只要1個小時就可以跑完,這次跑了4個多小時還望不到頭兒,找過來需要友情協助。
干運維的都是苦命孩子,大家能互相幫襯的就互相幫襯點兒,你說要是找我借個十塊八塊錢的話,我也幫不上忙。這手到擒來的活兒,還是義不容辭的擼起袖子,開始排查問題原因。
根據這哥們兒提供過來的sql文本,在庫里找到了對應的會話及正在運行的SQL。查看session相關屬性信息,確定與跟之前運行的時間相差很大(看來這大兄弟也是實在人,硬是多扛了3個多小時才喊痛)。看到這個差別第一反應是執行計劃的相關原因導致,核實執行計劃后,果然和懷疑的一樣,執行計劃一直在變。
既然執行計劃總是在變,那咱就看看這2個執行計劃的區別在哪兒?
執行計劃顯示SQL是一個insert....select....語句,SQL中有/*+APPEND ENABLE_PARALLEL_DMLPARALLEL("a",8)+*/開啟PDML并行的hint,其中低效的執行計劃顯示DML并行無效(PDMLdisabled because object is not decorated with parallelclause)。
我們繼續分析執行計劃發現高效執行計劃在預插入數據的目標表insert及其索引維護動作均開啟了并行,但低效執行計劃沒有。
問題點出現了:
為啥ENABLE_PARALLEL_DML的hint有時候起作用,有時候就失效了呢?
PDMLdisabled because object is not decorated with parallel clause?
為啥會報對象沒有用parallel子句修飾?難道是hint寫錯了?
順著這個思路繼續查看sql書寫規范,果然有發現,別名上多了雙引。
去掉雙引號測試一切回歸正常:
其實,這里有一個更穩妥的老司機的做法可以防止hint寫錯影響并行的開啟,使用會話級別打開并行:
altersession force parallel query parallel 16;
altersession force parallel dml parallel 16;
該方式就算hint寫錯了也沒關系,照樣會走并行。
總結:
從這個例子我們可以看到一個小小的雙引號竟然可以導致parallel hint間隙性失效,真是應了那句老話兒,一粒老鼠屎壞了一鍋湯。所以說工作中規范很重要。好了,本次分享到此結束,咱下回分享再見。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130215.html
摘要:正是存在問題,促使我們考慮引入數據庫審核平臺。的確,與很多互聯網公司相比,數據庫數十套的估摸并不是太大但與互聯網類公司不同,類似宜信這類金融類公司對數據庫的依賴性更大,大量的應用是重數據庫類的,且其使用復雜程度也遠比互聯網類的復雜。 作者:韓鋒 出處:DBAplus社群分享 Themis開源地址:https://github.com/CreditEaseDBA 拓展閱讀:宜信開源|數...
摘要:新晉技術專家下面是墨天輪部分新晉的技術專家。大家可以點擊往期閱讀墨天輪技術專家邀請函了解詳情,申請成為我們的技術專家,加入專家團隊,與我們一起創建一個開放互助的數據庫技術社區。新關聯公眾號墨天輪是一個開放互助的數據庫技術社區。 引言 近期我們在DBASK小程序增加了數據庫 MongoDB、Redis、 Elasticsearch、DB2、Weblogic 等新的的專題欄目和一些新的技術...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20