如何修改SQL脚本以获取特定数据库的最耗费资源查询?
针对单个数据库筛选高资源消耗SQL的修改方案
没问题,我来帮你调整这个脚本,让它只聚焦你指定的单个数据库。
原脚本是从sys.dm_exec_query_stats这个跨库的动态管理视图(DMV)获取数据,所以我们只需要加一个过滤条件,匹配目标数据库的标识即可。
修改后的完整脚本
SELECT TOP 100 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) as query, qs.execution_count, qs.total_logical_reads, qs.last_logical_reads, qs.total_logical_writes, qs.last_logical_writes, qs.total_worker_time, qs.last_worker_time, qs.total_elapsed_time/1000000 total_elapsed_time_in_S, qs.last_elapsed_time/1000000 last_elapsed_time_in_S, qs.last_execution_time, qp.query_plan FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp -- 关键过滤条件:指定目标数据库 WHERE qt.dbid = DB_ID('你的目标数据库名称') -- 替换成你要查询的数据库名 ORDER BY qs.total_worker_time DESC -- CPU time
关键修改说明
qt.dbid:sys.dm_exec_sql_text返回的字段,代表这条SQL所属的数据库IDDB_ID('你的目标数据库名称'):这个函数会返回你指定数据库的ID,用ID匹配比字符串比较更高效- 如果你觉得用数据库名更直观,也可以把WHERE条件改成:
WHERE DB_NAME(qt.dbid) = '你的目标数据库名称',效果完全一致
注意事项
- 确保你拥有
VIEW SERVER STATE权限,否则无法访问这些DMV - 对于跨库查询或者临时SQL(比如在tempdb中执行的),如果其核心逻辑不属于目标数据库,可能不会被筛选出来,这符合我们只看指定库的需求
内容的提问来源于stack exchange,提问作者Varda Elentári
相关产品推荐
相关产品推荐

