SQL Server 2008高CPU使用率

时间:2012-04-25 16:12:52

标签: database performance sql-server-2008

我们有一台带有SQL Server 2008的Windows 2008 R2服务器。该服务器有多个.net站点,其上有SQL服务器数据库。

我们目前的平均CPU使用率为95%,SQL Server负责大部分用量。

我想确定哪个网站对此负责,因此我们可以优先选择或将其移至其他服务器。但我没有找到任何直接看待这个的方法。

我一直在寻找能否找到:

  • 获取CPU密集度最高的查询的数据库
  • 负责CPU密集型查询的过程

使事情复杂化的一件事是我们有多个站点和“crons”使用相同的数据库。因此,一旦我识别出数据库,我还需要获得一些关于哪个site / cron负责的提示。

我真的很感激任何帮助,因为这个问题使我们的网站真的很慢......

由于

2 个答案:

答案 0 :(得分:27)

您可以使用DMV识别昂贵的查询(以及与之关联的数据库),例如: from this TechNet article

SELECT TOP 50
 [Average CPU used] = total_worker_time / qs.execution_count,
 [Total CPU used] = total_worker_time,
 [Execution count] = qs.execution_count,
 [Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
         (CASE WHEN qs.statement_end_offset = -1 
            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
          ELSE qs.statement_end_offset END - 
qs.statement_start_offset)/2)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Average CPU used] DESC;

这些将告诉您有关重击的查询,但不幸的是,它不能查明可能具有大量小型查询的数据库,这些小型查询单独使用小比特的CPU,但总计是大比特。您可以使用此查询from Glenn Allan Berry's DMV queries

执行此操作
WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
  SUM(total_worker_time) AS [CPU_Time_Ms]
 FROM sys.dm_exec_query_stats AS qs
 CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
              FROM sys.dm_exec_plan_attributes(qs.plan_handle)
              WHERE attribute = N'dbid') AS F_DB
 GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
       DatabaseName, [CPU_Time_Ms], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) 
       OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

这些查询都没有标识运行它们的应用程序,并且所使用的DMV不存储该信息(您必须捕获该行为中的查询并记下sys.dm_exec_sessions中的应用程序名称,或查看跟踪)

当然,您可以使用市场上的各种第三方性能工具自动完成这项工作(免责声明:我为其中一个人工作,SQL Sentry,谁生成Performance Advisor,它完成上述所有工作,包括跟踪高成本查询并维护有关他们运行的数据库以及应用程序调用它们的信息。

答案 1 :(得分:0)

或者,您可以使用“活动”监视器查看服务器的运行状况。 从那里你可以挑出长时间运行的查询,任何锁,如行锁,表锁等等

http://www.mssqltips.com/sqlservertip/1917/performance-analysis-using-sql-server-2008-activity-monitor-tool/