11

SQL Server 2008 を搭載した Windows 2008 R2 サーバーがあります。そのサーバーには、SQL サーバー データベースを含む複数の .net サイトがあります。

現在、CPU の平均使用率は 95% であり、SQL Server がその使用率のほとんどを占めています。

どのサイトがこれを担当しているかを特定して、最適化するか、別のサーバーに移動できるようにしたいと思います. しかし、これを見る直接的な方法は見つかりませんでした。

私が見つけることができるかどうか探していました:

  • 最も CPU を集中的に使用するクエリを取得しているデータベース
  • CPU を集中的に使用するクエリを処理するプロセス

物事を複雑にしているのは、同じデータベースを使用する複数のサイトと「cron」があることです。したがって、データベースを特定したら、どのサイト/cronがそれを担当しているかについてのヒントも取得する必要があります。

この問題によりサイトが非常に遅くなっているため、これについて何か助けていただければ幸いです...

ありがとう

4

2 に答える 2

28

たとえば、次の TechNet の記事から、DMV を使用してコストのかかるクエリ (およびそれらが関連付けられているデータベース) を特定できます。

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 を使用しているが、全体としては大きなビットを使用している小さなクエリが非常に大量にある可能性があるデータベースを特定することはできません。Glenn Allan Berry の DMV クエリからの次のクエリでそれを行うことができます。

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 でアプリケーション名をメモするか、トレースを確認する必要があります)。

もちろん、この作業は、市場に出回っているさまざまなサードパーティのパフォーマンス ツールを使用して自動化できます (免責事項: 私はそのうちの 1 つである SQL Sentry で働いており、パフォーマンス アドバイザーを作成しています。クエリを実行し、それらが実行されたデータベースとそれらを呼び出したアプリケーションに関する情報を維持します)。

于 2012-04-25T16:47:07.190 に答える
1

または、アクティビティ モニターを使用して、サーバーの状態を表示することもできます。そこから、実行時間の長いクエリ、行ロック、テーブル ロックなどのロックを特定することができます。

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

于 2012-04-25T17:27:56.793 に答える