2017-02-14 130 views
1

我在特定時間面臨高CPU使用率。 4個處理器,16GB RAM,29個數據庫 總數據文件大小60 GB。我經常得到高線程數太高。 任何人都可以幫助我嗎?sqlserver2012上的CPU利用率很高

+1

到目前爲止做了什麼?你有沒有看過等待?這可能是一個很好的開始https://mssqlwiki.com/2012/10/04/troubleshooting-sql-server-high-cpu-usage/ –

+1

右鍵單擊一個ny數據庫並查看可用的各種報告。有些對於識別「沉重」的觀點和程序非常有用。 –

回答

3

沒有直接的解決方案。您將不得不查找查詢,這會導致高CPU和微調它們。

下面DMV,賦予您正在消耗更多的CPU

SELECT TOP 50 qs.creation_time, qs.execution_count, qs.total_worker_time as total_cpu_time, qs.max_worker_time as max_cpu_time, 
qs.total_elapsed_time, qs.max_elapsed_time, qs.total_logical_reads, qs.max_logical_reads, qs.total_physical_reads, qs.max_physical_reads,t.[text], qp.query_plan, t.dbid, t.objectid, t.encrypted, qs.plan_handle, qs.plan_generation_num FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp 
ORDER BY qs.total_worker_time DESC 

疑問,你都這麼說,線程數是high.It 可能是由於並行的well..so,你可能必須找出並行運行的查詢。

找到它們後,找出它們並行執行的原因。在大多數情況下,這可能是由於缺少索引。

這個查詢將幫助你在這:Find Query Plans That May Utilize Parallelism

SELECT 
p.*, 
q.*, 
cp.plan_handle 
FROM sys.dm_exec_cached_plans cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) p 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) q 
WHERE cp.cacheobjtype = 'Compiled Plan' 
AND p.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";max(//p:RelOp/@Parallel)', 'float') > 0 
+1

第二個查詢非常有用 –

0

使用下面的語句來檢查哪些數據庫所使用的大部分CPU:

WITH DB_CPU_Stats 
AS 
(SELECT DatabaseID, DB_Name(DatabaseID) AS [Database Name],  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 [CPU Rank], 
[Database Name], [CPU_Time_Ms] AS [CPU Time (ms)], 
CAST([CPU_Time_Ms] * 1.0/SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5,2)) AS [CPU Percent] 
FROM DB_CPU_Stats 
WHERE DatabaseID <> 32767 -- ResourceDB 
ORDER BY [CPU Rank] OPTION (RECOMPILE); 

或者這種說法找到其SQL語句中使用的大多數CPU

SELECT TOP 50 
[Avg. MultiCore/CPU time(sec)] = qs.total_worker_time/1000000/qs.execution_count, 
[Total MultiCore/CPU time(sec)] = qs.total_worker_time/1000000, 
[Avg. Elapsed Time(sec)] = qs.total_elapsed_time/1000000/qs.execution_count, 
[Total Elapsed Time(sec)] = qs.total_elapsed_time/1000000, 
qs.execution_count, 
[Avg. I/O] = (total_logical_reads + total_logical_writes)/qs.execution_count, 
[Total I/O] = total_logical_reads + total_logical_writes, 
Query = 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 
), 
Batch = qt.[text], 
[DB] = DB_NAME(qt.[dbid]), 
qs.last_execution_time, 
qp.query_plan 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp 
where qs.execution_count > 5 --more than 5 occurences 
ORDER BY [Total MultiCore/CPU time(sec)] DESC 

第二條語句在這裏找到: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/33c7521f-7ed4-4574-82dd-aeb2f32111c5/find-high-cpu-query?forum=sqldatabaseengine