通過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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.7定位消耗CPU高的SQLMySql
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- postgresql定位top cpu sqlSQL
- SQLServer如何查詢近3分鐘最消耗CPU的SQLSQLServer
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- 執行sed命令卡死CPU消耗100%一例分析
- 如何快速定位當前資料庫消耗 CPU 最高的 sql 語句?資料庫SQL
- 詳述一條SQL引發的高CPU故障處理過程SQL
- top命令找到佔用CPU最高的java執行緒Java執行緒
- Oracle優化案例-教你線上搞定top cpu的sql(十二)Oracle優化SQL
- CPU利用率過高的原因
- 高通進dump和抓取解析dump log
- 恆訊科技分析:如何解決SQL Server CPU使用率過高的問題?SQLServer
- 通過程式找sqlSQL
- SQL Server伺服器CPU爆高解決SQLServer伺服器
- 【雲趣科技】Oracle優化案例-教你線上搞定top cpu的sql(十三)Oracle優化SQL
- 記一次K8S叢集Node節點CPU消耗高故障K8S
- 生產中遇到 cpu 過高排查
- Python通過代理多執行緒抓取圖片Python執行緒
- systrace抓取log命令
- 高通處理器CPU效能路線圖
- java應用CPU佔用率過高排查Java
- cpu使用率過高問題(Java)Java
- Spark SQL 教程: 通過示例瞭解 Spark SQLSparkSQL
- Oracle 中定位重要(消耗資源多)的SQLOracleSQL
- top 命令
- 通過redis的monitor命令排除故障Redis
- 乾貨分享|快速定位UXDB中CPU高負荷的SQL語句UXSQL
- [20191101]通過zsh計算sql語句的sql_id.txtSQL
- [20191011]通過bash計算sql語句的sql_id.txtSQL
- Oracle資料庫 11.2.0.4 EMON程式持續消耗CPUOracle資料庫
- 通過命令curl 操作ElasticSearch指南Elasticsearch
- 一次FGC導致CPU飆高的排查過程GC
- mysql佔用CPU過高的解決辦法(新增索引)MySql索引
- 公司某資料子系統定期cpu過高的診斷
- 通過新增條件優化SQL優化SQL
- Top 命令使用
- 解密"top"命令解密
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI