如何监控SQL Server数据库?

如何监控SQL Server数据库?

我有 SQL Server 2008,上面有多个数据库。该服务器上的 CPU 经常达到 100%。我想找出哪个数据库可能导致了这种情况。最简单的方法是什么?

我的“神奇”偶像工具会告诉我:

  1. SQL Server 的 CPU、RAM 和 IO
  2. 深入研究并显示每个数据库的相同信息
  3. 深入研究并显示导致问题的查询等等。

答案1

我更喜欢使用系统视图中的信息sys.dm_exec_query_stats. 活动监视器对我来说不方便。

为了获取信息,sys.dm_exec_query_stats我使用以下我发现的脚本这里(不幸的是,它是俄语的)。适用于 SQL Server 2005+。

使用此脚本,您可以根据所需字段过滤或分组查询,更重要的是,获取有关查询所属的最后执行时间和对象(SP,触发器)的信息(活动监视器不提供此信息)。

该脚本的唯一缺点是它仅返回缓存查询计划的聚合性能统计信息。如果某个计划因任何原因(内存不足、重新编译)从缓存中删除,您将看不到该查询的统计信息。

set transaction isolation level read uncommitted
select 
    top 100
    creation_time,
    last_execution_time,
    execution_count,
    total_worker_time/1000 as CPU,
    convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
    qs.total_elapsed_time/1000 as TotDuration,
    convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
    total_logical_reads as [Reads],
    total_logical_writes as [Writes],
    total_logical_reads+total_logical_writes as [AggIO],
    convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
    case 
        when sql_handle IS NULL then ' '
        else(substring(st.text,(qs.statement_start_offset+2)/2,(
            case
                when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2      
                else qs.statement_end_offset    
            end - qs.statement_start_offset)/2  ))
    end as query_text,
    db_name(st.dbid)as database_name,
    object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
from sys.dm_exec_query_stats  qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc

答案2

我想你会在以下两篇文章中找到答案:1, 和2

相关内容