通過top命令抓取cpu高消耗的sql
top命令在linux環境維護中很實用,雖然功能缺失不夠sar那麼全面。今天和大家分享一個通過top命令來抓取效能sql的案例。
通過top命令抓取了如下的資訊。
pid是3585的程式對應的sql 之前已經確定是效能問題導致的了,所以先放過,可以看看pid是8879的這個程式,出現的不是很“穩定”。
可能通過ash,awr不一定能夠及時的抓住這些資訊,但是通過及時的分析,可能有時候會得到一想不到的收穫。
可以通過v$session,v$process,v$sql來結合查詢process對應的sql.
可以看到這個程式是屬於一個遠端的session(LOCAL=NO),是通過一個batch的伺服器上發起的請求。
執行的sql很簡單。就是一個簡單的查詢。初步懷疑就是因為查詢走了全表掃描而且那個欄位可能沒有索引。
為了確認,檢視錶的結構來看看。可以結合user_tab_cols,user_ind_columns來檢視錶的屬性和索引的資訊。這些都是用準備好的指令碼來生成的,過濾了一些不必要的資訊。
可以看到,索引是存在的,在ext_account_number上,而且是唯一性索引。如果那樣的話走全表掃描就有些不合常理了。
如果觀察的再仔細些,可以看到ext_account_number那個欄位是varchar2(12)的。
為了驗證表肯定走了全表掃描,我抓了一個awrsqrpt的報告。內容如下,可以看到的確走了全表掃描。而且buffer gets還挺大,cpu消耗比較高。
到此為止,如果還不沒明白的話,我做個簡單的測試。
我從表裡隨機抓取10條記錄。
SQL> SELECT balance ,EXT_ACCOUNT_NUMBER from ACCOUNT WHERE rownum<=10;
BALANCE EXT_ACCOUNT_NUMBER
---------- ------------
0 10257832
772.81 10260829
584.22 10259790
329.03 10258781
-.39 10263317
-.14 10260830
496.79 10258782
0 10258783
-.83 10258785
-.91 10259791
10 rows selected.
這樣問題的根源就很清晰了。再換一個,試試走索引的情況。可以看到,效率有了極大的提升。剩下的問題就是協調來解決了。
通過top命令抓取了如下的資訊。
pid是3585的程式對應的sql 之前已經確定是效能問題導致的了,所以先放過,可以看看pid是8879的這個程式,出現的不是很“穩定”。
可能通過ash,awr不一定能夠及時的抓住這些資訊,但是通過及時的分析,可能有時候會得到一想不到的收穫。
可以通過v$session,v$process,v$sql來結合查詢process對應的sql.
可以看到這個程式是屬於一個遠端的session(LOCAL=NO),是通過一個batch的伺服器上發起的請求。
執行的sql很簡單。就是一個簡單的查詢。初步懷疑就是因為查詢走了全表掃描而且那個欄位可能沒有索引。
為了確認,檢視錶的結構來看看。可以結合user_tab_cols,user_ind_columns來檢視錶的屬性和索引的資訊。這些都是用準備好的指令碼來生成的,過濾了一些不必要的資訊。
可以看到,索引是存在的,在ext_account_number上,而且是唯一性索引。如果那樣的話走全表掃描就有些不合常理了。
如果觀察的再仔細些,可以看到ext_account_number那個欄位是varchar2(12)的。
為了驗證表肯定走了全表掃描,我抓了一個awrsqrpt的報告。內容如下,可以看到的確走了全表掃描。而且buffer gets還挺大,cpu消耗比較高。
到此為止,如果還不沒明白的話,我做個簡單的測試。
我從表裡隨機抓取10條記錄。
SQL> SELECT balance ,EXT_ACCOUNT_NUMBER from ACCOUNT WHERE rownum<=10;
BALANCE EXT_ACCOUNT_NUMBER
---------- ------------
0 10257832
772.81 10260829
584.22 10259790
329.03 10258781
-.39 10263317
-.14 10260830
496.79 10258782
0 10258783
-.83 10258785
-.91 10259791
10 rows selected.
然後來trace一把。看看執行的情況。
可以看到,確實走了全表掃描,沒有走索引。可以看到filter部分,對於ext_account_number它是在解析的時候做了型別轉換的,從varchar2轉為number。
一致性讀有12704.
可以看到,確實走了全表掃描,沒有走索引。可以看到filter部分,對於ext_account_number它是在解析的時候做了型別轉換的,從varchar2轉為number。
一致性讀有12704.
這樣問題的根源就很清晰了。再換一個,試試走索引的情況。可以看到,效率有了極大的提升。剩下的問題就是協調來解決了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1143010/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 透過top命令抓取cpu高消耗的sqlSQL
- MySQL 5.7定位消耗CPU高的SQLMySql
- 通過shell指令碼來檢視Undo中資源消耗高的sql指令碼SQL
- sql調優學習之cpu消耗過多...SQL
- 獲得消耗cpu較高的topsqlSQL
- 硬解析帶來高CPU消耗的診斷
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- postgresql定位top cpu sqlSQL
- 記一次Oracle Sql最佳化經歷--消耗過多CPUOracleSQL
- 如何捕獲問題SQL解決過度CPU消耗問題 (zt)SQL
- 捕獲問題SQL解決過度CPU消耗問題-- 轉載SQL
- 找出消耗CPU最高的程式對應的SQL語句SQL
- 透過shell指令碼來檢視Undo中資源消耗高的sql指令碼SQL
- 通過shell指令碼抓取awr報告中的問題sql指令碼SQL
- SQLServer如何查詢近3分鐘最消耗CPU的SQLSQLServer
- 通過SPA方式在Lugz0庫抓取SQL指令碼SQL指令碼
- AWR報告分析之一:高 DB CPU 消耗的效能根源-eygle
- Oracle高資源消耗SQL語句定位OracleSQL
- sun平臺top10 cpu命令
- cpu瓶頸 top的核心sy佔用較高
- 通過shell抓取html資料HTML
- 詳述一條SQL引發的高CPU故障處理過程SQL
- 執行sed命令卡死CPU消耗100%一例分析
- 如何快速定位當前資料庫消耗 CPU 最高的 sql 語句?資料庫SQL
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- oracle 高耗cpu sql語句的捕捉 。OracleSQL
- AIX常用命令收藏:記憶體和CPU消耗程式排序AI記憶體排序
- top命令找到佔用CPU最高的java執行緒Java執行緒
- Oracle優化案例-教你線上搞定top cpu的sql(十二)Oracle優化SQL
- 獲取top N cpu pid的sql資訊指令碼SQL指令碼
- sql語句引起的CPU佔用國高SQL
- 通過Linux命令過濾出binlog中完整的SQL語句LinuxSQL
- 恆訊科技分析:如何解決SQL Server CPU使用率過高的問題?SQLServer
- 監控使用高cpu的sql語句指令碼SQL指令碼
- 生產中遇到 cpu 過高排查
- 使用error stack 抓取儲存過程的當前SQLError儲存過程SQL
- 記一次K8S叢集Node節點CPU消耗高故障K8S
- Mysql佔用過高CPU時的優化手段MySql優化