
Record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)','int') AS , Record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)', 'int') AS , SQLProcessUtilization AS sql_server_process_cpu,ġ00 - SystemIdle - SQLProcessUtilization AS other_process_cpu,ĭATEADD(ms, -1 * - ), GETDATE()) AS event_time

SELECT = cpu_ticks/(cpu_ticks/ms_ticks)FROM sys.dm_os_sys_info In your performance monitor are you looking at the _Total or per processor? Also, you can run the query below to see how SQL Server is reporting its own CPU utilization (thank you Glenn Berry). Depending on the timing of these parallel threads, it could present as low CPU usage in the % Processor Time. Note that it could have been a parallel query and only used 10% of five schedulers (which correlate to the number of CPUs). This means that 50% of one CPU's time was dedicated to this query. In your example below, 500ms of CPU time for the SQLOS scheduler has been consumed by that query in the last second. On a system with multiple schedulers ( sys.dm_os_schedulers), it is possible to have queries go parallel and use multiple schedulers and have > 1000ms/sec of CPU time.

Restated, it has used 1000 ms of CPU time for that second. The reason you're seeing 1000 in this result set could be because that query used all CPU time for that one-second interval. However, the ms in the report is in milliseconds for the Activity Monitor and microsecond would be mcs. Internally to SQL Server in this DMV ( sys.dm_exec_query_stats) CPU time is measured in microseconds and the report is pulling the usage per second.

This is the ratio of CPU time used by that query per second.
