SQL Server 查看CPU情況


--CPU相關視圖  
SELECT * FROM sys.dm_os_sys_info  
SELECT * FROM sys.dm_exec_sessions  
SELECT * FROM sys.sysprocesses  
SELECT * FROM sys.dm_os_tasks  
SELECT * FROM sys.dm_os_workers  
SELECT * FROM sys.dm_os_threads  
SELECT * FROM sys.dm_os_schedulers  
SELECT * FROM sys.dm_os_memory_objects  
SELECT * FROM sys.dm_os_nodes  
SELECT * FROM sys.dm_os_memory_nodes  
  
exec sp_configure 'max degree of parallelism'--系統默認並行度  
exec sp_configure 'cost threshold for parallelism' --並發閾值  
exec sp_configure 'max worker threads'--系統最大工作線程數  
exec sp_configure 'affinity mask' --CPU關聯  
  
--數據庫系統 cpu,線程 數量  
select max_workers_count,scheduler_count,cpu_count,hyperthread_ratio  
,(hyperthread_ratio/cpu_count) AS physical_cpu_count  
,(max_workers_count/scheduler_count) AS workers_per_scheduler_limit  
from sys.dm_os_sys_info  
  
  
--執行的線程所遇到的所有等待的相關信息  
SELECT TOP 10 wait_type,waiting_tasks_count,signal_wait_time_ms   
FROM sys.dm_os_wait_stats ORDER BY signal_wait_time_ms DESC  
  
--正在等待某些資源的任務的等待隊列的信息  
SELECT TOP 10 wait_type,wait_duration_ms,session_id,blocking_session_id   
FROM sys.dm_os_waiting_tasks ORDER BY wait_duration_ms DESC  
  
  
--CPU或調度器當前分配的工作情況  
SELECT scheduler_id,cpu_id,status,is_idle  
,current_tasks_count AS 當前任務數           --在等待或運行的任務  
,runnable_tasks_count AS 等待調度線程數        --已分配任務並且正在可運行隊列中  
,current_workers_count AS 當前線程數     --相關或未分配任何任務的工作線程  
,active_workers_count AS 活動線程數          --在運行、可運行或掛起  
,work_queue_count AS 掛起任務數              --等待工作線程執行  
FROM sys.dm_os_schedulers  
WHERE scheduler_id < 255  
  
  
--當前線程數  
select COUNT(*) as 當前線程數 from sys.dm_os_workers  
  
--非SQL server create的threads  
select * from sys.dm_os_threads where started_by_sqlservr=0 --即scheduler_id > 255  
  
--有task 等待worker去執行  
select * from sys.dm_os_tasks where task_state='PENDING'  
  
--計數器  
select * from  sys.dm_os_performance_counters where object_name='SQLServer:SQL Statistics'  
select * from  sys.dm_os_performance_counters where object_name='SQLServer:Plan Cache'  
  
  
  
-----------------------------------------------------------------------------  
-----------------------------------------------------------------------------  
  
--1. 實例累積的信號(線程/CPU)等待比例是否嚴重  
SELECT CAST(100.0 * SUM(signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2))  AS [%signal (cpu) waits],    
CAST(100.0 * SUM(wait_time_ms - signal_wait_time_ms) / SUM (wait_time_ms) AS  NUMERIC(20,2)) AS [%resource waits]    
FROM sys.dm_os_wait_stats WITH (NOLOCK) OPTION (RECOMPILE);   
  
  
--2. SqlServer各等待類型的線程等待信息  
SELECT TOP 20   
wait_type,waiting_tasks_count ,wait_time_ms,signal_wait_time_ms   
,wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms   
,CONVERT(NUMERIC(14,2),100.0 * wait_time_ms /SUM (wait_time_ms ) OVER( )) AS percent_total_waits   
,CONVERT(NUMERIC(14,2),100.0 * signal_wait_time_ms /SUM (signal_wait_time_ms) OVER( )) AS percent_total_signal_waits   
,CONVERT(NUMERIC(14,2),100.0 * ( wait_time_ms - signal_wait_time_ms )/SUM (wait_time_ms ) OVER( )) AS percent_total_resource_waits   
FROM sys .dm_os_wait_stats  
WHERE wait_time_ms > 0  
ORDER BY percent_total_signal_waits DESC  
  
  
--3. 閂鎖(latch)等待的信息  
select top 20 latch_class,waiting_requests_count,wait_time_ms,max_wait_time_ms  
from sys.dm_os_latch_stats  
order by wait_time_ms desc  
  
  
--使用最多處理器時間的用戶數據庫  
;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);  
  
  
--緩存中最耗CPU的語句  
select total_cpu_time,total_execution_count,number_of_statements,[text]   
from (  
    select top 20    
    sum(qs.total_worker_time) as total_cpu_time,    
    sum(qs.execution_count) as total_execution_count,   
    count(*) as  number_of_statements,    
    qs.plan_handle    
    from sys.dm_exec_query_stats qs   
    group by qs.plan_handle   
    order by total_cpu_time desc  
) eqs cross apply sys.dm_exec_sql_text(eqs.plan_handle) as est  
order by total_cpu_time desc  
  
  
  
  
  
/*【ask 讓出scheduler :worker yielding】  
1. worker讀數據頁超過4ms  
2. 64k結果集排序  
3. compile或recompile(常有)  
4. 客戶端不能及時取走結果集  
5. batch 的每個操作完整  
*/  
  
  
--當前正在執行的語句  
SELECT   
der.[session_id],der.[blocking_session_id],  
sp.lastwaittype,sp.hostname,sp.program_name,sp.loginame,  
der.[start_time] AS '開始時間',  
der.[status] AS '狀態',  
der.[command] AS '命令',  
dest.[text] AS 'sql語句',   
DB_NAME(der.[database_id]) AS '數據庫名',  
der.[wait_type] AS '等待資源類型',  
der.[wait_time] AS '等待時間',  
der.[wait_resource] AS '等待的資源',  
der.[reads] AS '物理讀次數',  
der.[writes] AS '寫次數',  
der.[logical_reads] AS '邏輯讀次數',  
der.[row_count] AS '返回結果行數'  
FROM sys.[dm_exec_requests] AS der   
INNER JOIN master.dbo.sysprocesses AS sp on der.session_id=sp.spid  
CROSS APPLY  sys.[dm_exec_sql_text](der.[sql_handle]) AS dest   
WHERE [session_id]>50 AND session_id<>@@SPID AND DB_NAME(der.[database_id])='platform'    
ORDER BY [cpu_time] DESC  
  
  
  
--實例級最大的瓶頸  
WITH Waits AS   
(   
    SELECT wait_type , wait_time_ms / 1000. AS wait_time_s , 100.* wait_time_ms / SUM(wait_time_ms) OVER ( ) AS pct ,  
    ROW_NUMBER() OVER ( ORDER BY wait_time_ms DESC ) AS rn   
    FROM sys.dm_os_wait_stats   
    WHERE   
    wait_type NOT IN ( 'CLR_SEMAPHORE', 'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE', 'SLEEP_TASK', 'SLEEP_SYSTEMTASK', 'SQLTRACE_BUFFER_FLUSH', 'WAITFOR', 'LOGMGR_QUEUE',   
    'CHECKPOINT_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BROKER_TO_FLUSH', 'BROKER_TASK_STOP', 'CLR_MANUAL_EVENT', 'CLR_AUTO_EVENT',  
    'DISPATCHER_QUEUE_SEMAPHORE', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN' )   
)  
SELECT W1.wait_type , CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s ,   
CAST(W1.pct AS DECIMAL(12, 2)) AS pct ,CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct   
FROM Waits AS W1   
INNER JOIN Waits AS W2 ON W2.rn <= W1.rn   
GROUP BY W1.rn , W1.wait_type , W1.wait_time_s , W1.pct   
HAVING SUM(W2.pct) - W1.pct < 95 ; -- percentage threshold  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM