1. 程式人生 > >[Oracle維護工程師手記]一次升級後執行變慢的分析

[Oracle維護工程師手記]一次升級後執行變慢的分析

客戶報告,
當他從 Oracle 11.1.0.7 ,遷移到雲環境,並且升級到12.1.0.2。
執行客戶的應用程式測試,發現比以前更慢了。

從AWR report 的"Top 10 Foreground Events by Total Wait Time"和"Wait Classes by Total Wait Time"等資訊,
可以看到 CPU 值升高了。

初步思考,懷疑由於環境的不同,導致效能不同。但是客戶說,這兩個環境的CPU數目/記憶體大小等各方面情況都完全一樣。
那麼就的考慮其他的原因了。

遷移前的環境和遷移後的環境對比,從AWR report 中,可以看到,遷移後的 "Hard parse"  的比例明顯偏高。

***遷移前
Load Profile
Per Second Per Transaction Per Exec Per Call
DB Time(s): 1.1 0.0 0.00 0.00
DB CPU(s): 0.3 0.0 0.00 0.00
Parses: 158.3 4.8
Hard parses: 8.8 0.3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Executes: 620.2 18.2

***遷移後
Load Profile
Per Second Per Transaction Per Exec Per Call
DB Time(s): 0.8 0.0 0.00 0.00
DB CPU(s): 0.6 0.0 0.00 0.00
Parses (SQL): 375.8 14.7
Hard parses (SQL): 75.2 3.0 <<<<<<<<<<<<<<<<<<<<<<<<< hard parse 大幅度增加
Executes (SQL): 702.7 28.3

客戶報告,在新環境裡,設定了 對 應用中的所有的 SQL文 都追加了 類似於
"SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.1.0.7') ORDERED INDEX(T0001 T0001_001) NO_USE_HASH(FBM10) */" 的hint之後,
發現效能基本回到了遷移前的水平。

從這一點來考慮,OPTIMIZER_FEATURES_ENABLE,可能是影響到了 optimizer_adaptive_features 功能。這一功能會在SQL文執行
的時候,動態地判斷有沒有更好的執行計劃。而很可能對客戶程式的一部分SQL文,反而動態調整執行計劃產生了大量的Hard Parse,
整體上拖延了執行時間。

客戶也懷疑 是 文件 2312911.1 所提到的 12.1 的 optimizer_adaptive_features 功能不夠完善導致出現問題。文件 2312911.1
提及,12.1 的 optimizer_adaptive_features 功能不夠完善,可以特殊處理,以達到12.2的效果(12.2中, optimizer_adaptive_
features 有所改善,被拆分成為了兩個引數)。

那麼,到底是不是這樣呢,客戶希望進一步進行分析調查。

從拿到了遷移前後的AWR來對比,發現了有趣的狀況:實際上從Top N SQL來看,遷移前的SQL文,遷移後執行時間其實都大幅度縮短了。

    ***遷移前環境
    ========================
    SQL ordered by Elapsed Time
       Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
       % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
       Total DB Time (s): 2,597  
       Captured SQL account for 58.8% of Total  <<<<<<<<<<<<Top 10 的SQL文,佔據了整體執行時間的 59%(1532秒)
       Total DB Time (s): 2,597
       Captured PL/SQL account for 0.3% of Total
    ========================

    ***遷移後(未追加 OPTIMIZER_FEATURES_ENABLE hint 的時候)
    ========================
    SQL ordered by Elapsed Time  ★
       Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
       % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
       %Total - Elapsed Time as a percentage of Total DB time
       %CPU - CPU Time as a percentage of Elapsed Time
       %IO - User I/O Time as a percentage of Elapsed Time
       Captured SQL account for 27.9% of Total DB Time (s): 1,771  <<<<<<<<<<<<Top 10 的SQL文,佔據了整體執行時間的 28%(500秒)
       Captured PL/SQL account for 1.3% of Total DB Time (s): 1,771
    ========================

從具體的top 10 SQL文執行時間上,也可以看出來:

    ++++++++++++++++++++++++++++++++++++++++++++++
    2ac8g6tagg67x  遷移後>>17,122 回執行  CPU Time 13.27s、Elapsed Time 139.03s  
                           遷移前>>21,018 回執行  CPU Time 16s、Elapsed Time 839s

    5mt3dyz3r6af8  遷移後>>425 回執行  CPU Time 25.28s、Elapsed Time 33.10s
                          遷移前>>509回執行  CPU Time 44s、Elapsed Time 105s

    7tjhsnk6ruw6m  遷移後>>165 回執行  CPU Time 16.67s、Elapsed Time 21.69s
                           遷移前>>165 回執行  CPU Time 25s、Elapsed Time 50s

    ......

    baq2zs9gns3co  遷移後>>51,730 回執行  CPU Time 9.92s、Elapsed Time 16.57s
                           遷移前>>67,66 4回執行  CPU Time 10s、Elapsed Time 26s
    ++++++++++++++++++++++++++++++++++++++++++++++

那麼,問題到底處在哪裡呢? 我的猜測是: 雖然TopN 那些SQL文的執行時間減小了。但是還有很多執行很短暫的SQL文,由於動態執行
計劃調整,導致事件增加了。

這也很容易理解:

如果一條SQL語句的執行時間原本是200ms,如果動態執行計劃調整花5ms,使得因執行更好的執行計劃而較少了執行時間20ms,總體上來說
就是賺到了。

可是如果你一條小SQL執行語句,本來執行時間才20ms,如果動態執行計劃調整花5ms,使得因執行更好的執行計劃而較少了執行時間2ms,
反而執行時間增加了。

如果這條小SQL執行語句,反覆多次執行呢?那問題就惡化了。

就好比:雖說磨刀不誤砍柴功,但是如果每砍一個小樹杈,都要磨一次刀,那是不是有點浪費時間啊。

對於這個推測,客戶仍然想要了解更詳細的細節,那麼好吧,我們來看看ASH的情況:

遷移前

"In Hard Parse" ==> 15 行     "In Hard Parse" 的比例:37.5%
2018/03/12 15:26:36 --->  2018/03/12 15:37:25.693000000
SQL_ID: 30 個

遷移後

"In Hard Parse" ==> 252 行     "In Hard Parse" 的比例:76.6%
2018/03/20 11:33:50 --->  2018/03/20 12:25:58.591000000
SQL_ID: 292 個


遷移後的總體時間不但大幅度延長了,而且ASH中統計出來的sql_id 明顯增多。所以可以推測很多原本執行時間很短的sql語句,因為執行計劃
調整的原因,話費時間進行了 Hard Parse,所以當ASH取樣的時候,因為沒有執行完畢,更多的出現在ASH履歷中。

那麼,作為結論, 12c的執行計劃調整並不是適合所有sql文的,對效果不佳的語句,不妨新增 OPTIMIZER_FEATURES_ENABLE 進行微調。

相關推薦

[Oracle維護工程師手記]升級執行分析

客戶報告,當他從 Oracle 11.1.0.7 ,遷移到雲環境,並且升級到12.1.0.2。執行客戶的應用程式測試,發現比以前更慢了。從AWR report 的"Top 10 Foreground Events by Total Wait Time"和"Wait Classes by Total Wait

[Oracle維護工程師手記系列]升級運行分析

設置 增加 整體 dex classes 並不是 select 統計 系列 客戶報告,當他從 Oracle 11.1.0.7 ,遷移到雲環境,並且升級到12.1.0.2。運行客戶的應用程序測試,發現比以前更慢了。從AWR report 的"Top 10 Foreground

[Oracle維護工程師手記系列]為什麽flashback 的時候既需要 flashback log ,又需要 archive log?

頻繁 acl ack 就是 系列 AS arc ive flashback 為什麽flashback 的時候既需要 flashback log ,又需要 archive log 呢? 如果數據庫的活動不是很頻繁,可以看到,其flashback log 是比較小的。那麽是通

[Oracle維護工程師手記系列]Data Guard Broker中改屬性是否需要兩側分別執行

HA out 需要 nal res 登陸 tor status external Data Guard Broker中改屬性是否需要兩側分別執行?Data Guard Broker有一些屬性,可以通過 show configuration 看到。我有時會想,這些個屬性,是否

[Oracle維護工程師手記]兩表結合的MVIEW的告訴重新整理

對兩表結合查詢建立MVIEW,進行MVIEW的的高速重新整理失敗,如何處理?例如: SQL> drop user u1 cascade;User dropped.SQL> grant dba to u1 identified by u1;Grant succeeded.SQL> con

[Oracle維護工程師手記]為什麼flashback 的時候既需要 flashback log ,又需要 archive log?

為什麼flashback 的時候既需要 flashback log ,又需要 archive log 呢? 如果資料庫的活動不是很頻繁,可以看到,其flashback log 是比較小的。那麼是通過怎樣的方式 flashback 到過去的呢? 示意如下: 12:50 第一次更改資料(100-->2

[Oracle維護工程師手記]Data Guard Broker中改屬性是否需要兩側分別執行

Data Guard Broker中改屬性是否需要兩側分別執行?Data Guard Broker有一些屬性,可以通過 show configuration 看到。我有時會想,這些個屬性,是否是分別屬於primary 和 standby,如果想要修改,是否需要分別登陸到primary 和 standby ,來

解Bug之路-記線上請求偶爾的排查

# 解Bug之路-記一次線上請求偶爾變慢的排查 ## 前言 最近解決了個比較棘手的問題,由於排查過程挺有意思,於是就以此為素材寫出了本篇文章。 ## Bug現場 這是一個偶發的效能問題。在每天幾百萬比交易請求中,平均耗時大約為300ms,但總有那麼100多筆會超過1s,讓我們業務耗時監控的99.99線變得很尷

Oracle斷電重啟無法登陸資料庫

3.SQL> ALTER DATABASE OPEN;-----輸出:ALTER DATABASE OPEN-----輸出:第 1 行出現錯誤:-----輸出:ORA-00600: 內部錯誤程式碼, 引數: [kcratr_nab_less_than_odr], [1], [99189],-----輸

CTF對二維碼的認識

inf body 讀取 轉化 ctf比賽 二維碼 png 一段 定位 前一段時間參加一個CTF比賽的時候其中有一個題目就是一張二維碼圖片,然後獲取其中的信息來解題,那個二維碼的特別之處在於,它把3個位置探測區域用幾張美女圖片代替了,然後在做題的時候順便簡單的了解了一下二

CentOS 7靜默安裝Oracle 11g(記最小化CentOS 7安裝Oracle 11g的經歷)

1.最小化安裝CentOS 7後首先設定一下固定IP可以先查詢一下自己的網絡卡裝置的名稱,是ens33,所以網絡卡配置檔名稱就是ifcfg-ens33(前面的ifcfg-不用管,固定的)ip addr開啟網絡卡配置檔案:vi /etc/sysconfig/network-sc

記錄升級公司框架導致的service注入失敗的問題

背景:公司使用的還是jdk7,早就想升級到jdk8,但是很坑爹的是,公司的框架使用的是Netty3.2.7和spring3.x,不能升級,jdk8必須使用spring4.x才可以,當然,spring4.x可以向下相容jdk7.思考再三,長痛不如短痛,升級Netty3.2.7到Netty4.1.3

面試的人生感悟,是什麼促進了我開始寫部落格的決心

最近突然想到想寫部落格了,雖然在老男孩培訓的時候,老師說到每個技術人員都要寫部落格,當初還不以為然,直到這次面試,深有感觸 說起這次面試,是我有史以來印象最深刻的一次.平時面試,大同小異,問你會做什麼,做過哪些,這些有什麼技巧,再問一些深一點的問題,就結束了.然面試官也是在

linux curl每秒請求 成功終止

#!/bin/bash while [ true ]; do /bin/sleep 2 #幾秒請求一次 rst=`curl -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'User-Agen

jquery操作checkBox的選中和事件操作(解決取消不能選中)

總結一下checkBox實際開發中結合jquery常用屬性和事件: 1,checkBox選中狀態發生改變的方法: $(function(){$("#basketBall").change(function(){alert("baseketBall  changing");}

“失利”經過半年準備通過阿里社招的經歷與感悟

寫在最前 本次分享一下在作者上一次“失利”即拿到畢業證第二天突然“收到”阿里社招面試通知失敗之後,通過分析自己的定位與實際情況,做出的未來一到兩年的規劃。以及本次社招的面試經歷(但這部分不是重點,每個人的面試經歷都是不一樣的。千人千面嘛) PS:當然了計劃趕

Oracle張表儲存大量資料再刪除查詢問題

開發十年,就只剩下這套架構體系了! >>>   

害你加班的bug就是我寫的,記升級Jenkins外掛引發的加班

## 主旨 本文主要記錄了下Jenkins升級外掛過程中出現的場景,一次加班經歷,事發時沒有截圖,有興趣可以看看。 ## 起因 ### 需求 最近有個需求:在Jenkins流水線中完成下載Git上的檔案簡單修改並提交的功能 起初找到了相關的外掛用法,即使用 `SSH Agent Plugin` 來完成這個

lvs-tunnel模式的故障分析(SYN_REC)

過濾 oot som 一次 hose 不知道 也會 推理 min 一、測試環境 類型 IP 負載均衡器 eth0:10.20.73.20 VIP eth0:0 10.20.73.29 後端真實機 10.0.0.7(web01)、10.0.0.9(we

內存溢出的分析經歷——thrift帶給我的痛orz

一個bug 服務端 ide 參數 comment ces 結果 業務 改變 說在前面的話 朋友,你經歷過部署好的服務突然內存溢出嗎? 你經歷過沒有看過Java虛擬機,來解決內存溢出的痛苦嗎? 你經歷過一個BUG,百思不得其解,頭發一根一根脫落的煩惱嗎? 我知道,你有過! 但