1、性能調優概述
性能問題的症狀
響應時間慢
吞吐量低
資源佔用高(CPU、Memory、I/0等)
數據庫角度
數據庫邏輯設計
數據庫物理設計(存儲規劃)
SQL語句
數據庫調優關鍵
I/O最關鍵
減少I/O
最大化I/O效率
存儲規律,物理設計
CPU兩個殺手
表掃描
排序
Memory命中率可能會騙人
SQL是一切問題的根源
2、性能調優步驟
明確問題->收集數據->分析數據->細化、定位問題->優化
3、DB2數據庫監控工具-db2pd
3.1、監控工具總結
即時監控工具
Snapshot
db2pd
db2top
事件監控工具
Event monitor
新事件監控工具
對數據的訪問是通過SQL語句執行的,絕大數性能問題都是SQL本身問題
動態語句:JDBC、DB2命令行
靜態語句:存儲過程、嵌入式SQL程序
3.2、db2pd命令工具
3.2.1 db2pd介紹
用於監控和DB2疑難分析
非***式工具,對DB2的性能影響小
在 8.2 版中, 引入一種新的工具 db2pd 來監控和管理 DB2 數據庫和實例。使用這一工具可以跟蹤事務、表空間、表統計信息、動態 SQL 和所有配置信息。對於故障檢修、確定問題和性能調優等方面。
db2pd用於收集 DB2 實例和數據庫的統計信息。db2pd 提供了 20 多個選項顯示關於數據庫事務、表空間、表統計信息、動態 SQL、數據庫配置和其他很多細節的信息。單個 db2pd 命令可以檢索多個領域的信息,並把結果保存到文件中。也可以在特定時期內調用該工具一定的次數,幫助您瞭解隨着時間的變化數據庫中的變動情況。該工具可用於故障檢修、問題確定、數據庫監控、性能調優和幫助應用程序的開發設
3.2.2、db2pd基本應用
格式: db2pd -d dbname-options
選項:
-applications -agents -transactions -bufferpools -logs
-locks -tablespaces -dynamic -static -fcm
-mempools -memsets -dbmcfg -dbcfg -catalogcache
-sysplex -tcbstats -reorg -recovery -repot -osinfo
db2pd有22個選項,如果想對所有分區,所有活動數據庫,運行所有選項,您只要輸入db2pd-everything,就會列出所有信息
3.2.3、db2pd選項解析
如果想控制輸出的範圍,可以參考如下:
-ins 輸出實例相關信息
-db dbname 輸出數據庫dbname相關信息,用於單一指定的數據庫。
-alldb 輸出所有數據庫信息。
-dbppartitionnum 輸出特定的數據庫分區服務器的信息
-alldbp 輸出所有數據庫分區服務器的信息
-osinfo 輸出操作系統相關信息
實例範圍的選項:
(1)-agents
輸出DB2代理的相關信息。在日常監控中是一個比較常用的選項,執行方式和輸出方式可以通過不同了選項進行控制
db2pd -agentsdb=db2db
只輸出數據庫DB2DB相關信息。相關子選項還包括agent=<agentid>,application=<appid>等。
(2)-fcm FCM信息
(3)-mempools 輸出內存池相關信息
(4)-dbmcfg 輸出dbm配置信息,等同於get dbm cfg 命令,但輸出格式稍有不同。
(5)-utilities 輸出db2實用程序相關信息。如果正在進行數據庫備份
數據庫範圍的選項,注意,數據庫範圍的選項一定要指定某個數據庫,加上參數-db dbname
(1)-applications 特定數據庫的應用程序的相關信息。
[db2inst1@localhost ~]$ db2pd -applications-db db2db
同時還有很多相關子選項用於更精確的輸出某個應用程序的相關信息。
(2)-transactions 輸出某個特定數據庫的事務信息
(3)-bufferpools 輸出某個特定數據庫的緩衝池信息
(4)-logs 輸出某個特定數據庫的日誌信息
(5)-reorgs 輸出某個特定數據庫的表重組信息
其它用途選項:
(1)-repeat [numsec] [count] 該選項用於重複db2pd命令,並指定間隔多長時間執行多少次,例如:
[db2inst1@localhost ~]$ db2pd -agents -repeat2 5
該命令表明輸出實例的代理進程信息,並且是每2秒種輸出一次,共輸出5次。
(2)-file<filename> 該選項將輸出結果保存到一個指定文件中。例如:
[db2inst1@localhost ~]$ db2pd-agents -repeat 2 5 -file agent_info.txt
(3)db2pd 命令的所有選項都可以使用前三個字符的縮寫,只有兩個除外:-mempools 和–memsets。
接下來講一個具體應用db2pd的例子。
如果想確定誰給數據庫加了鎖,並想知道銷類型等相關信息:
[db2inst1@localhost ~]$ db2pd-db db2db -lock -transactions -agents -file lock_info.txt
該命令會將lock,transactions,agents三項的輸出保存到lock_info.txt中。然後通過lock部分輸出中TranHdl可以在transactions輸出中找到AppHandl,然後再根據AppHandl,可以在agents部分輸出中
找到持有該鎖的Userid。在確定是誰給數據庫加了鎖。
要想了解db2pd命令的全部信息,可以執行db2pd -help來獲得。
使用實例:
1.sh /tmp/20141103/test.sh 生成app.txt
2.db2pd -d nns -dyn > dyn.txt
3.根據app.txt中 L-AnchIdL-StmtUID中的值搜索 dyn.txt
定位sql 搜索時四個空格
4、數據庫快照分析
4.1 快照信息解析
數據庫快照包含一些統計信息、狀態信息等,通過db2 get snapshotfor database on nns 或sysibmadm.snapdb
數據庫連接和代理信息
鎖相關信息:死鎖、鎖等、鎖超時、鎖升級信息
排序信息:排序溢出、排序時間
緩衝池信息:同步、異步邏輯/物理讀/寫、命中率
事務信息:提交/回滾的事務數
SQL語句信息:動態、靜態SQL語句; Select/UDI SQL:增刪改查的行數
日誌信息:日誌空間、最早的事務
Package cache命中率
Catalog cache命中率
4.2、重要快照信息種類
4.2.1、應用快照
db2 get snapshot forapplications on nns
db2 get snapshot forapplications agentid appl-handler
註明:appl-handler可以從list applications的輸出中得到
或者
select * fromsysibmadm.snapdb
select * fromsysibmadm.snapappl_info
獲取應用執行情況,找到異常應用
查看當前併發應用
db2 list applications
db2 list applications showdetail
db2 list applications fornns [show detail]
4.2.2、錶快照
db2 get snapshot for tableson nns
或者
select * fromsysibmadm.snaptab
讀取表的讀取行數,跟蹤熱表
4.2.3、動態sql快照
db2 get snapshot for dynamicsql on nns
或者
select * fromsysibmadm.snapdyn_sql
獲取動態SQL的語句的執行情況,如執行次數、執行時間、CPU時間、排序、鎖等信息。
5、關鍵性能指標(KPI)
5.1 指標性能總括
讀有效性:rows_read/rows_selected
同步讀百分比:數據、索引讀的效率
表的讀寫效率
Bufferpool命中率
......
5.2、讀有效性
rows_read/rows_selected
讀有效性表示每獲取一條記錄需要訪問的行
對於OLTP,最好小於20
對於OLAP,最好小於100
selectROWS_READ/(ROWS_SELECTED+1) as rows_read_effi from sysibmadm.snapdb orders byrows_read_effi
當讀有效值比較高時,表示可能在發生表掃描,可通過索引等手段進行優化。
5.3、同步讀百分比
數據從存儲加載到bufferpool有同步和異步兩種方式
同步(synchronousI/O):當有合適的索引時,db2會使用同步I/O訪問需要的索引和數據頁
異步(AsynchronousI/O):當沒有合適的索引時,或SQL語句不夠優化時,db2使用異步存取(prefetch)I/O掃描數據或索引
同步讀百分比=
100-100*(Asynchronous pooldata pages reads + Asynchronous pool index page reads)/ (Buffer pool dataphysical reads + Buffer pool index reads + 1)
對於交易系統,同步I/O的百分比越高越好,反之則需要優化。
5.4、I/O讀寫
找到I/O讀寫頻繁的表
Sysibmadm.snaptab
select substr(tabname,1,20)as tabname,rows_read,rows_written from sysibmadm.snaptab order by rows_readdesc
db2pd -tcbstat 查找表掃描較多的表
6、動態語句
找到最差的dynamic SQL語句
通過Sysibmadm.snapdyn_sql視圖,扎到如下字段進行排序,扎到最差的SQL
ROWS_READ
ROWS_WRITTEN
NUM_EXCUTIONS
NUM_COMPILATIONS
STMT_SORTS
TOTAL_EXEC_TIME
TOTAL_SYS_CPU_TIME
TOTAL_USER_CPU_TIME
STMT_TEXT
6.1、查看運行時間最長的SQL語句
db2 "selectnum_executions as "Num Execs",average_execution_time_s as "AvgTime(sec)",stmt_sorts as "Num Sorts",sorts_per_execution as"Sorts Per Stmt",substr(stmt_text,1,35) as "SQL Stmt" from sysibmadm.top_dynamic_sql wherenum_executions > 0 order by 2 desc fetch first 10 rows only"
6.2、平均執行時間最長的SQL語句
db2 "select substr(stmt_text,1,500) as stmt_text,average_execution_time_s,num_executionsfrom sysibmadm.top_dynamic_sql orderby average_execution_time_s desc fetch first 10 rows only"|grep -ivselected
6.3、讀取行數最多的SQL語句
db2 "select substr(stmt_text,1,500)as stmt_text,NUM_EXECUTIONS,ROWS_READ,ROWS_WRITTEN,STMT_SORTS,SORT_OVERFLOWS ,TOTAL_SORT_TIME,TOTAL_USR_CPU_TIME,TOTAL_EXEC_TIMEfrom sysibmadm.snapdyn_sql order by ROWS_READdesc fetch first 10 rows only"|grep -iv selected
6.4、執行次數最多的SQL語句
db2 "select substr(stmt_text,1,500)as stmt_text,NUM_EXECUTIONS,TOTAL_USR_CPU_TIME,TOTAL_EXEC_TIME,SORT_OVERFLOWSfrom sysibmadm.snapdyn_sql order by NUM_EXECUTIONS desc fetch first 10 rowsonly"|grep -iv selected
6.5、排序最多的SQL語句
db2 "selectsubstr(stmt_text,1,500) as stmt_text,stmt_sorts,SORT_OVERFLOWS,TOTAL_USR_CPU_TIME,NUM_EXECUTIONSfrom sysibmadm.snapdyn_sql order bystmt_sorts desc fetch first 10 rows only"|grep -iv selected
6.6、DB2 V9新特性——重點TOP_DYNAMIC_SQL
和oracle的top sql對應的是sysibmadm.top_dynamic_sql,以下的視圖所在的模式都是sysibmadm
使用快照管理視圖來標識高成本應用程序
ShopMart 數據庫上最近的工作負載增長已開始影響到整體數據庫性能。Jessie 是 ShopMart 的 DBA,她嘗試使用下列管理視圖來標識日常工作負載中較大的資源使用者:
6.6.1、APPLICATION_PERFORMANCE讀取的行數
此視圖幫助 Jessie 標識可能正在執行大型表掃描操作的應用程序:
connect to shopmart;
select AGENT_ID, ROWS_SELECTED, ROWS_READ from APPLICATION_PERFORMANCE;
ROWS_SELECTED 值顯示返回給應用程序的行數,ROWS_READ 值顯示在基本表中訪問的行數。如果選擇率很低,則表示該應用程序可能正在執行表掃描操作,通過創建索引可以避免應用程序執行該操作。Jessie 使用此視圖來標識可能有問題的查詢,然後,她可以進行進一步調查,即查看 SQL 以確定是否能夠減少查詢在執行時讀取的行數。
6.6.2、LONG_RUNNING_SQL 執行的運行時間
Jessie 使用 LONG_RUNNING_SQL 管理視圖來標識當前正在執行的運行時間最長的查詢:
connect to shopmart;
select ELAPSED_TIME_MIN, APPL_STATUS, AGENT_ID from long_running_sql
order by ELAPSED_TIME_MIN desc fetch first 5 rows only;
通過使用此視圖,她可以確定這些查詢已運行的時間長度以及這些查詢的狀態。如果某個查詢已執行了很長時間並且正在等待鎖,她就可以使用對特定代理程序標識執行查詢的 LOCKWAITS 或 LOCK_HELD 管理視圖來進行進一步調查。LONG_RUNNING_SQL 視圖還會指出正在執行的語句並允許她標識可能有問題的 SQL。
6.6.3、QUERY_PREP_COST運行頻率和平均執行時間
Jessie 使用 QUERY_PREP_COST 來對已確定有問題的查詢進行故障診斷。此視圖可以指出查詢的運行頻率以及這些查詢中每個查詢的平均執行時間:
connect to shopmart;
select NUM_EXECUTIONS, AVERAGE_EXECUTION_TIME_S, PREP_TIME_PERCENT from
QUERY_PREP_COST order by NUM_EXECUTIONS desc;
PREP_TIME_PERCENT 值向 Jessie 指出準備查詢時耗用的時間在查詢執行時間中所佔的百分比。如果編譯和優化查詢時耗用的時間幾乎與查詢的執行時間一樣長,那麼,Jessie 可以建議該查詢的所有者更改用於該查詢的優化類。降低優化類可以使該查詢更快地完成優化,從而更快地返回結果。但是,如果某個查詢需要相當長的時間來進行準備,但要執行數千次(而不必再次進行準備),則更改優化類並不能提高查詢性能。
6.6.4、TOP_DYNAMIC_SQL 執行頻率運行時間排序次數
Jessie 使用 TOP_DYNAMIC_SQL 視圖來標識執行頻率最高、運行時間最長和排序次數最多的動態 SQL 語句。有了此信息,Jessie 在進行 SQL 調整工作時就可以把注意力放在代表某些最大資源使用者的查詢上
爲了標識運行頻率最高的動態 SQL 語句,Jessie 發出以下語句:
connect to shopmart;
select * from TOP_DYNAMIC_SQL order by NUM_EXECUTIONS
desc fetch first 5 rows only;
此語句返回執行頻率最高的 5 個動態 SQL 語句的所有執行時間、排序執行次數和語句文本詳細信息。
爲了標識執行時間最長的動態 SQL 語句,Jessie 檢查AVERAGE_EXECUTION_TIME_S 值最大的 5 個查詢:
connect to shopmart;
select * from TOP_DYNAMIC_SQL order by AVERAGE_EXECUTION_TIME_S
desc fetch first 5 rows only;
爲了查看排序次數最多的動態 SQL 語句的詳細信息,Jessie 發出以下語句:
connect to shopmart;
select STMT_SORTS, SORTS_PER_EXECUTION, substr(STMT_TEXT,1,60) asSTMT_TEXT
from TOP_DYNAMIC_SQL order by STMT_SORTS desc fetch first 5 rows only;
7、靜態語句
通過database snapshot,staticstatement attemptd表示有靜態語句執行
$db2pd -d sample -static
每個存儲過程或嵌入式c在內部都是一個package,每條語句都是Package裏的section,可通過syscat.statement查找
select substr(pkgname,1,20) as pkgname,substr(text,1,100) as text fromsyscat.statements where pkgnamae=’P9134667’
MON_GET_PKG_CACHE_STMT存儲過程返回當前packagecache裏的動態語句和靜態語句
SELECT MEMBER,SECTION_TYPE,TOTAL_CPU_TIME/NUM_EXEC_WITH_METRICS AS AVG_CPU_TIME,substr(stmt_text,1,50)from TABLE(MON_GET_PKG_CACHE_STMT(NULL,NULL,NULL,-2) as T WHERET.NUM_EXEC_WITH_METRICS <> 0 order by AVG_CPU_TIME