2012-04-25 70 views
11

Chúng tôi có Windows 2008 R2 Server với SQL Server 2008 trong đó. Máy chủ đó có nhiều trang .net có cơ sở dữ liệu máy chủ SQL trên đó.SQL Server 2008 Sử dụng CPU cao

Hiện tại chúng tôi đang sử dụng mức sử dụng CPU trung bình là 95% và SQL Server chịu trách nhiệm cho hầu hết việc sử dụng đó.

Tôi muốn xác định trang web nào chịu trách nhiệm về điều này để chúng tôi có thể chọn hoặc chuyển trang web đó sang máy chủ khác. Nhưng tôi đã không tìm thấy bất kỳ cách nào trực tiếp để tìm kiếm điều này.

Tôi đã tìm kiếm nếu tôi có thể tìm thấy:

  • Cơ sở dữ liệu đó là nhận được CPU nhất truy vấn chuyên sâu
  • Quá trình đó là chịu trách nhiệm về CPU truy vấn chuyên sâu

Một điều điều đó cũng làm phức tạp những thứ là chúng ta có nhiều trang web và "crons" sử dụng cùng một cơ sở dữ liệu. Vì vậy, một khi tôi xác định cơ sở dữ liệu tôi cũng sẽ cần phải nhận được một số gợi ý trong đó trang web/cron chịu trách nhiệm về nó.

Tôi thực sự sẽ đánh giá cao bất kỳ giúp đỡ về vấn đề này như vấn đề này được đưa ra trang web của chúng tôi thực sự chậm ...

Cảm ơn

Trả lời

27

Bạn có thể xác định truy vấn tốn kém (và các cơ sở dữ liệu chúng có liên quan với) sử dụng DMVs , ví dụ 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; 

Những điều này sẽ cho bạn biết về các truy vấn hitter nặng, nhưng tiếc là nó sẽ không xác định một cơ sở dữ liệu có thể có khối lượng rất cao của các truy vấn nhỏ mà đang sử dụng bit nhỏ của CPU riêng nhưng bit lớn trong tổng hợp. Bạn có thể làm điều đó với truy vấn này 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); 

Cả các truy vấn này xác định các ứng dụng mà chạy chúng, và DMVs sử dụng không lưu trữ thông tin đó (bạn sẽ phải bắt các truy vấn trong hành động và lưu ý tên ứng dụng trong sys.dm_exec_sessions hoặc xem lại một dấu vết).

Tất nhiên bạn có thể tự động hóa công việc này với nhiều công cụ hiệu suất bên thứ ba trên thị trường (từ chối trách nhiệm: Tôi làm việc cho một trong số họ, SQL Sentry, người sản xuất Performance Advisor, thực hiện tất cả những điều trên, bao gồm theo dõi các truy vấn chi phí cao và duy trì thông tin về cơ sở dữ liệu nào họ chạy và ứng dụng nào được gọi là chúng).

Các vấn đề liên quan