如何在DB2中识别有毒SQL

如何在DB2中识别有毒SQL,db2,stability,Db2,Stability,我们有一个任务来识别在数据库中激发的有毒查询并杀死它们,这样应用程序就不会因此受到影响。例如,应该终止使用更多CPU的长时间运行的查询。我做了一些研究,发现DB2企业版中有一种叫做WLM的东西。此外,我们已经与少数DBA讨论过,并且在下面了解了一些可以从WLM(工作负载管理器)监视的参数 估计DSQLCost、ACTIVITYTOTALTIME、SQLTEMPSPACE、UOWTOTALTIME 在我继续深入了解这些问题的同时,是否有人可以提供一些信息或分享一些关于哪些参数可用于识别此类有毒查询

我们有一个任务来识别在数据库中激发的有毒查询并杀死它们,这样应用程序就不会因此受到影响。例如,应该终止使用更多CPU的长时间运行的查询。我做了一些研究,发现DB2企业版中有一种叫做WLM的东西。此外,我们已经与少数DBA讨论过,并且在下面了解了一些可以从WLM(工作负载管理器)监视的参数

估计DSQLCost、ACTIVITYTOTALTIME、SQLTEMPSPACE、UOWTOTALTIME


在我继续深入了解这些问题的同时,是否有人可以提供一些信息或分享一些关于哪些参数可用于识别此类有毒查询(可能会影响其他操作)的专业知识。

问题有点笼统,但我可以就您可能感兴趣的几个场景提供一些指导:

“有毒”查询正在数据库中执行。 对于那些你可以使用的。它为您提供数据库中所有活动的详细度量。坏SQL通常可以通过以下方式识别: -长执行时间(总动作时间) -读取的行数高(rows\u read),甚至更好,读取的行数与返回的行数之比(例如,我们希望SELECT*读取很多行,但它也会返回那么多) -数据读取(POOL_data_L_reads)与索引读取(POOL_index_L_reads)的比率很高,这通常表明查询可以从更好的索引中获益

示例查询可能如下所示:

db2 "select local_start_time, application_handle, total_act_time, rows_read, rows_returned, pool_index_l_reads, pool_data_l_reads, substr(stmt_text,1,100) as stmt_text from table(mon_get_activity(null, -2)) where member=coord_partition_num order by total_act_time desc"

LOCAL_START_TIME    APP_HANDLE TOTAL_ACT_TIME  ROWS_READ    ROWS_RETURNED POOL_I_L_READS POOL_D_L_READS STMT_TEX
------------------- ---------- -------------- ----------    ------------- -------------- --------------- -------
2019-09-26-10.31.57    3640333       66633923      78863           629729             32               0 SELECT 
2019-09-26-10.31.57    2329627       66627534     225535           629729             32               0 SELECT 
2019-09-26-10.31.57    1019395       66613118      95760           629729             18               0 SELECT 
2019-09-26-10.31.57    3640332       66608933      32607           302242              4               0 SELECT 

(当然还有更多有趣的指标可用,我只是展示了一些) 识别查询后,可以包括
EXECUTABLE\u ID
列并用于生成解释

过去已执行但仍在包缓存中的查询。 对于那些您可以使用和使用类似于1的计数器。注意,这一个包含所有执行的累积度量,因此您可能希望将数字除以
NUM\u执行

将来可能执行的查询
若要缩小此类查询的范围,您可以在特定查询超过某个阈值(SQLROWSREAD、ACTIVITYTOTALRUNTIME等)时使用并进行Db2收集诊断(
收集活动数据
),甚至访问计划(
带详细信息部分)。此外,您可以自动中断此类查询(
停止执行
)。

这个问题有点笼统,但我可以就您可能感兴趣的几个场景提供一些指导:

“有毒”查询正在数据库中执行。 对于那些你可以使用的。它为您提供数据库中所有活动的详细度量。坏SQL通常可以通过以下方式识别: -长执行时间(总动作时间) -读取的行数高(rows\u read),甚至更好,读取的行数与返回的行数之比(例如,我们希望SELECT*读取很多行,但它也会返回那么多) -数据读取(POOL_data_L_reads)与索引读取(POOL_index_L_reads)的比率很高,这通常表明查询可以从更好的索引中获益

示例查询可能如下所示:

db2 "select local_start_time, application_handle, total_act_time, rows_read, rows_returned, pool_index_l_reads, pool_data_l_reads, substr(stmt_text,1,100) as stmt_text from table(mon_get_activity(null, -2)) where member=coord_partition_num order by total_act_time desc"

LOCAL_START_TIME    APP_HANDLE TOTAL_ACT_TIME  ROWS_READ    ROWS_RETURNED POOL_I_L_READS POOL_D_L_READS STMT_TEX
------------------- ---------- -------------- ----------    ------------- -------------- --------------- -------
2019-09-26-10.31.57    3640333       66633923      78863           629729             32               0 SELECT 
2019-09-26-10.31.57    2329627       66627534     225535           629729             32               0 SELECT 
2019-09-26-10.31.57    1019395       66613118      95760           629729             18               0 SELECT 
2019-09-26-10.31.57    3640332       66608933      32607           302242              4               0 SELECT 

(当然还有更多有趣的指标可用,我只是展示了一些) 识别查询后,可以包括
EXECUTABLE\u ID
列并用于生成解释

过去已执行但仍在包缓存中的查询。 对于那些您可以使用和使用类似于1的计数器。注意,这一个包含所有执行的累积度量,因此您可能希望将数字除以
NUM\u执行

将来可能执行的查询
若要缩小此类查询的范围,您可以在特定查询超过某个阈值(SQLROWSREAD、ACTIVITYTOTALRUNTIME等)时使用并进行Db2收集诊断(
收集活动数据
),甚至访问计划(
带详细信息部分)。此外,您可以自动中断此类查询(
停止执行
)。

非常详细的响应。让我从以上输入开始,感谢您的指导。非常详细的回答。让我从以上输入开始,感谢您的指导。