一條簡單的sql語句導致的系統問題
新年,給大家拜年了。祝大家工作順利,萬事如意。
今天照例簡單檢查了系統的情況,發現在客戶的伺服器在下午的3-5點這個時間段,資料庫負載略有上升,但是幅度不大,因為生產的awr抓取頻率是10分鐘,所以還是能夠透過awr分析出一些問題。
負載情況如下:
抓取了一個最新時間段的awr報告。
檢視資料庫負載,比平時的負載要高一些。
從這個概覽來看還是看不出特別之處,只能對整體的情況有一個把握。這是一個10分鐘的報告。
Load profile是我檢視awr報告的重點部分。能夠發現user calls和executions的值很高。
這個時候基本能夠從load profile裡面找到問題的方向了,user calls和executions的部分需要注意,首先問題的方向很可能是從sql語句級別導致的,語句執行的如此頻繁,勢必會對buffer gets有較大的影響,這個報告中parses的值很低,至少說明問題不是由於繫結變數導致的。我們可以檢視等待事件基本確定時間都去哪了,哪些等待事件是需要重點關注的。然後在sql語句部分來分析了,基本可以從order by Elapsed time, order by Gets, order by Executions這三個部分來佐證了。
等待事件如下:
今天照例簡單檢查了系統的情況,發現在客戶的伺服器在下午的3-5點這個時間段,資料庫負載略有上升,但是幅度不大,因為生產的awr抓取頻率是10分鐘,所以還是能夠透過awr分析出一些問題。
負載情況如下:
抓取了一個最新時間段的awr報告。
檢視資料庫負載,比平時的負載要高一些。
Host Name | Platform | CPUs | Cores | Sockets | Memory (GB) |
---|---|---|---|---|---|
xxxxx | Linux x86 64-bit | 80 | 40 | 4 | 346.22 |
Snap Id | Snap Time | Sessions | Cursors/Session | |
---|---|---|---|---|
Begin Snap: | 33108 | 19-Feb-15 15:40:21 | 5147 | 5.4 |
End Snap: | 33109 | 19-Feb-15 15:50:22 | 5256 | 5.5 |
Elapsed: | 10.01 (mins) | |||
DB Time: | 533.14 (mins) |
從這個概覽來看還是看不出特別之處,只能對整體的情況有一個把握。這是一個10分鐘的報告。
Load profile是我檢視awr報告的重點部分。能夠發現user calls和executions的值很高。
Load Profile
Per Second | Per Transaction | Per Exec | Per Call | |
---|---|---|---|---|
DB Time(s): | 53.3 | 0.9 | 0.00 | 0.00 |
DB CPU(s): | 10.3 | 0.2 | 0.00 | 0.00 |
Redo size: | 2.2 MB | 37.4 KB | ||
Logical reads: | 10.3 GB | 179.3 MB | ||
Block changes: | 10,738.9 | 182.2 | ||
Physical reads: | 1.2 GB | 21.5 MB | ||
Physical writes: | 7.8 MB | 136.0 KB | ||
User calls: | 20,256.8 | 343.7 | ||
Parses: | 2,447.3 | 41.5 | ||
Hard parses: | 4.3 | 0.1 | ||
W/A MB processed: | 72.5 | 1.2 | ||
Logons: | 4.6 | 0.1 | ||
Executes: | 11,414.1 | 193.7 | ||
Rollbacks: | 0.6 | 0.0 | ||
Transactions: | 58.9 |
這個時候基本能夠從load profile裡面找到問題的方向了,user calls和executions的部分需要注意,首先問題的方向很可能是從sql語句級別導致的,語句執行的如此頻繁,勢必會對buffer gets有較大的影響,這個報告中parses的值很低,至少說明問題不是由於繫結變數導致的。我們可以檢視等待事件基本確定時間都去哪了,哪些等待事件是需要重點關注的。然後在sql語句部分來分析了,基本可以從order by Elapsed time, order by Gets, order by Executions這三個部分來佐證了。
等待事件如下:
Top 5 Timed Foreground Events
Event | Waits | Time(s) | Avg wait (ms) | % DB time | Wait Class |
---|---|---|---|---|---|
db file sequential read | 13,019,569 | 15,375 | 1 | 48.06 | User I/O |
enq: TX - row lock contention | 403 | 7,779 | 19303 | 24.32 | Application |
DB CPU | 6,185 | 19.34 | |||
direct path read | 425,941 | 1,882 | 4 | 5.88 | User I/O |
read by other session | 1,126,812 | 774 | 1 | 2.42 |
User I/O |
從這個等待事件可以看出,大部分的等待事件都集中在IO部分,當然導致的原因也是多方面的。第2個等待事件至少可以說明表中存在著鎖,這個也可能是導致資料庫負載增加的一個原因,在透過監控記錄檢視,或者抓取一個ash報告就能夠基本定位出那個時間段的鎖細節。已經做了確認,發現某一個process存在很多的併發dml操作,抓取了相應的資訊交給了開發處理。
但是這個問題和load profile中的user calls,executions的值過高應該沒有太大的關係。我們來直接進入sql資訊部分。
但是這個問題和load profile中的user calls,executions的值過高應該沒有太大的關係。我們來直接進入sql資訊部分。
SQL ordered by Elapsed Time
-
Elapsed Time (s) Executions Elapsed Time per Exec (s) %Total %CPU %IO SQL Id SQL Module SQL Text 01:39:59 1,344 4.46 18.75 0.33 0.00 dch8sxwt6ujvc JDBC Thin Client /* CL_ProcessController_update...01:25:38 95 54.08 16.06 6.94 96.79 6csnjz5kqcffm bl1extract@ccbdbpr1 (TNS V1-V3) SELECT /*+ leading (list payp...2,612.67 206 12.68 8.17 8.55 94.69 ffnjuh9qz1wy8 bl1extract@ccbdbpr1 (TNS V1-V3) SELECT /*+ leading (cust rate ...1,800.85 519 3.47 5.63 0.01 0.00 ffv3am85ccm25 JDBC Thin Client /* AC_AcCloseUpdateAcControl_u...1,554.22 13 119.56 4.86 17.15 86.22 fg5mc598u799u JDBC Thin Client select /*+ leading (bpm_ai bpm...1,476.63 13 113.59 4.62 30.53 66.68 4gz51fphuarsw JDBC Thin Client /* CL_ProcInstScanner_selectAv...952.12 361,344 0.00 2.98 12.69 92.74 62h1u7vsgjx9p bl1extract@ccbdbpr1 (TNS V1-V3) /* */ SELECT CUSTOMER_ID, SUBS...924.90 13 71.15 2.89 30.09 66.53 6fu3z8pqd2y9g JDBC Thin Client /* CL_WaitScanner_selectWorkab...600.66 0 1.88 8.85 94.53 1taqbbq0mw35u JDBC Thin Client SELECT OK.BAN, OK.MSISDN, OK.P...565.49 0 1.77 4.19 97.80 cqrms45fqwvr3 JDBC Thin Client /* Formatted on 2012/04/26 16:...514.37 2,552,072 0.00 1.61 99.27 0.00 0mynq29fmat7d getdate_int@ccbdbpr1 (TNS V1-V3) select TO_CHAR(LOGICAL_DATE, '...
SQL ordered by Gets
-
Buffer Gets Executions Gets per Exec %Total Elapsed Time (s) %CPU %IO SQL Id SQL Module SQL Text 1.2 TB 2,552,072 486.9 KB 19.12 514.37 99.27 0.00 0mynq29fmat7d getdate_int@ccbdbpr1 (TNS V1-V3) select TO_CHAR(LOGICAL_DATE, '...705.8 GB 25 28.2 GB 11.39 105.95 72.71 27.95 1hg2wcuapy3y3 JDBC Thin Client select bl1_run_request.run_mod...234.0 GB 13 18.0 GB 3.78 1,476.63 30.53 66.68 4gz51fphuarsw JDBC Thin Client /* CL_ProcInstScanner_selectAv...228.4 GB 13 17.6 GB 3.69 924.90 30.09 66.53 6fu3z8pqd2y9g JDBC Thin Client /* CL_WaitScanner_selectWorkab...190.4 GB 335 582.0 MB 3.07 192.38 99.90 0.00 aty7a3bvqfxxx JDBC Thin Client SELECT COUNT(1) FROM (/* null_...
SQL ordered by Executions
-
Executions Rows Processed Rows per Exec Elapsed Time (s) %CPU %IO SQL Id SQL Module SQL Text 2,552,072 2,551,077 1.00 514.37 99.27 0.00 0mynq29fmat7d getdate_int@ccbdbpr1 (TNS V1-V3) select TO_CHAR(LOGICAL_DATE, '...445,868 445,865 1.00 14.05 90.20 0.20 fa311gg43yjyf JDBC Thin Client Select CSM_TRX_1SQ.NEXTVAL fro...380,095 380,041 1.00 101.08 21.71 83.42 aprfnw5vk6szs java_q4p@ccbappr7 (TNS V1-V3) SELECT ch_objects.obj_id, ch_o...
這個時候透過這三個部分,能夠基本定位出問題發生在sql_id 0mynq29fmat7d這個語句上,這個語句就是 一個簡單的select查詢,查詢的表也很小。但是問題就是在10分鐘的時間範圍內執行了2百多萬次,這確實很不正常。從sql order by elapased部分可以看出這個語句佔用的 db time比例不高,從sql語句的執行上還是沒有問題的,但是透過sql order by gets和execution這兩個部分,可以很明顯的看到,這條語句是top 1的語句,使用的buffer gets高達1T,這個表中的資料量就幾千條資料,大小都是MB級別的,但是在10分鐘內卻能使用1T的buffer gets,確實讓我感覺很意外。
分析了這些問題之後,我的判斷是認為程式邏輯中的問題,稍後傳送了郵件和開發做確認。
透過這個問題可以看到sql語句導致的問題不一定是差的執行計劃導致的,簡單的sql語句照樣能夠導致一些意外的情況。但是執行的頻率為什麼這麼頻繁,還是屬於應用部分,只能讓他們提供更多的資訊了。而且分析問題的時候,發現了一些問題,可能在檢查的過程中又被其它的問題干擾了,很可能會讓自己偏離問題檢查的方向,很容易造成一個情況,發現忙活了半天,查問題的針對性不夠。
分析了這些問題之後,我的判斷是認為程式邏輯中的問題,稍後傳送了郵件和開發做確認。
透過這個問題可以看到sql語句導致的問題不一定是差的執行計劃導致的,簡單的sql語句照樣能夠導致一些意外的情況。但是執行的頻率為什麼這麼頻繁,還是屬於應用部分,只能讓他們提供更多的資訊了。而且分析問題的時候,發現了一些問題,可能在檢查的過程中又被其它的問題干擾了,很可能會讓自己偏離問題檢查的方向,很容易造成一個情況,發現忙活了半天,查問題的針對性不夠。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1445408/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 由一條sql語句導致的系統IO問題SQL
- 一條執行4秒的sql語句導致的系統問題SQL
- 一條insert語句導致的效能問題分析(一)
- 一條sql語句導致的資料庫當機問題及分析SQL資料庫
- 一條sql語句“導致”的資料庫當機問題及分析SQL資料庫
- 一條insert語句導致的效能問題分析(二)
- 一條簡單SQL語句的構成及語句解析SQL
- 一條簡單的sql語句執行15天的原因分析SQL
- 一條簡單的SQL語句優化-新年新氣象SQL優化
- 如此大的一條sql語句在30個左右的併發訪問系統當中的效能問題?SQL
- 執行SQL語句導致mysqld的crashMySql
- 一條"簡單"的sql語句和小兔子買麵包的故事SQL
- 一句簡單的SQL查詢語句的背後...SQL
- 一條SQL語句的書寫SQL
- 一條很 巧妙的 SQL 語句SQL
- 一條sql語句的優化SQL優化
- 一條SQL語句的旅行之路SQL
- 簡單的SQL語句學習SQL
- MySql和簡單的sql語句MySql
- 不當編寫SQL語句導致系統不安全(轉)SQL
- 不當編寫SQL語句導致系統不安全 (轉)SQL
- merge語句導致的效能問題緊急優化優化
- 利用sql語句解決簡單的數學題SQL
- 一個簡單的MySQL引數導致的連線問題解惑MySql
- 02 | 日誌系統:一條SQL更新語句是如何執行的?SQL
- 一條簡單的更新語句,MySQL是如何加鎖的?MySql
- 一條sql語句的改進探索SQL
- 一個JTextPane寫SQL語句的問題SQL
- 最簡單的sql語句(增刪改查統計)SQL
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-簡單CASESQL
- 一條sql語句的執行過程SQL
- 一條SQL語句的優化過程SQL優化
- 忽視細節導致簡單問題的複雜化 關於PUPBLD.SQLSQL
- 一個使用SQL語句解決的小問題SQL
- 對sql語句的優化問題SQL優化
- jivejdon sql語句問題SQL
- sql語句的簡化SQL
- 一條更新的SQL語句是如何執行的?SQL