方案:使用内置管理视图来识别高成本应用程序
ShopMart 数据库上最近的工作负载增长已开始影响到整体数据库性能。Jessie 是 ShopMart 的 DBA,她尝试使用下列管理视图来识别日常工作负载中较大的资源使用者:
- MON_CONNECTION_SUMMARY
- 此视图帮助 Jessie 识别可能正在执行大型表扫描操作的应用程序:
CONNECT TO SHOPMART; SELECT APPLICATION_HANDLE, ROWS_READ_PER_ROWS_RETURNED FROM SYSIBMADM.MON_CONNECTION_SUMMARY;ROWS_READ_PER_ROWS_RETURNED 的值向她显示了根据返回至应用程序的行从基本表访问的平均行数。如果此值是很大的数字,那么应用程序可能正在执行表扫描,可通过创建索引来避免该操作。Jessie 使用此视图来识别可能有问题的查询,然后,她可通过以下操作来进一步进行调查:查看 SQL 以了解是否能够减少在执行查询时读取的行数。
- MON_CURRENT_SQL
- Jessie 使用 MON_CURRENT_SQL 管理视图来识别当前正在执行的运行时间最长的查询:
CONNECT TO SHOPMART; SELECT ELAPSED_TIME_SEC, ACTIVITY_STATE, ACTIVITY_TYPE, APPLICATION_HANDLE FROM SYSIBMADM.MON_CURRENT_SQL ORDER BY ELAPSED_TIME_SEC DESC FETCH FIRST 5 ROWS ONLY;通过使用此视图,她可以确定这些查询已运行的时间长度以及这些查询的状态。如果某个查询的执行已持续很长时间并且正在等待锁定,那么她可在 MON_LOCKWAITS 管理视图上发出查询,并且指定要进一步调查的代理程序标识。MON_CURRENT_SQL 视图还可向她指出正在执行的语句,从而允许她识别可能有问题的 SQL。
- MON_PKG_CACHE_SUMMARY
- Jessie 使用 MON_PKG_CACHE_SUMMARY 来对已确定有问题的查询进行故障诊断。此视图可向她指出查询的运行频率以及每个此类查询的平均执行时间:
CONNECT TO SHOPMART; SELECT SECTION_TYPE, EXECUTABLE_ID, NUM_COORD_EXEC, NUM_COORD_EXEC_WITH_METRICS, AVG_STMT_EXEC_TIME, PREP_TIME FROM SYSIBMADM.MON_PKG_CACHE_SUMMARY ORDER BY NUM_COORD_EXEC DESC;PREP_TIME 的值会向 Jessie 指出编译查询所耗用的时间量(与它的执行时间比较)。如果编译和优化查询时耗用的时间几乎与查询的执行时间一样长,那么,Jessie 可以建议该查询的所有者更改用于该查询的优化类。降低优化类可以使该查询更快地完成优化,从而更快地返回结果。但是,如果某个查询需要相当长的时间来进行准备,但要执行数千次(而不必再次进行准备),那么更改优化类并不能提高查询性能。
-
Jessie 还使用 MON_PKG_CACHE_SUMMARY 视图来识别执行频率最高且运行时间最长的 SQL 语句。 有了此信息,Jessie 在进行 SQL 调整工作时就可以把注意力放在代表某些最大资源使用者的查询上。
为了识别运行频率最高的 SQL 语句,Jessie 发出下列语句:
输出会显示与执行频率最高的五个 SQL 语句的执行时间和语句文本有关的所有详细信息。CONNECT TO SHOPMART; SELECT SECTION_TYPE, NUM_COORD_EXEC, NUM_COORD_EXEC_WITH_METRICS, AVG_STMT_EXEC_TIME, PREP_TIME, SUBSTR(STMT_TEXT, 1, 100) AS STMT_TEXT FROM SYSIBMADM.MON_PKG_CACHE_SUMMARY ORDER BY NUM_COORD_EXEC DESC FETCH FIRST 5 ROWS ONLY;为了识别执行时间最长的 SQL 语句,Jessie 检查对于 AVG_STMT_EXEC_TIME 具有最大的五个值的查询:CONNECT TO SHOPMART; SELECT SECTION_TYPE, NUM_COORD_EXEC, NUM_COORD_EXEC_WITH_METRICS, AVG_STMT_EXEC_TIME, SUBSTR(STMT_TEXT, 1, 100) AS STMT_TEXT FROM SYSIBMADM.MON_PKG_CACHE_SUMMARY ORDER BY AVG_STMT_EXEC_TIME DESC FETCH FIRST 5 ROWS ONLY;