我的SQL裡哪個語句占用的CPU最多

2021-09-06 20:17:37 字數 1735 閱讀 4327

可以使用下面的語句來得到

select 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

),qs.execution_count,

qs.total_logical_reads, qs.last_logical_reads,

qs.total_logical_writes, qs.last_logical_writes,

qs.total_worker_time,

qs.last_worker_time,

qs.total_elapsed_time/1000000 total_elapsed_time_in_s,

qs.last_elapsed_time/1000000 last_elapsed_time_in_s,

qs.last_execution_time,

qp.query_plan

from

sys.

dm_exec_query_stats qs

sys.

dm_exec_sql_text

(qs.

sql_handle

) qt

sys.

dm_exec_query_plan

(qs.plan_handle) qp

order by qs.total_worker_time desc

-- cpu time

一些解釋:

sql server 有很多執行緒, 其基本的工作邏輯為: 不讓任何的runnable的thread餓死. sql server的執行緒管理並不是由作業系統管理的, 而是由sql server 自己管理的. sql server多數時候執行在nonpreemptive模式下的, 意味著執行緒都是互相協作的, 不時地通過主動放棄的方式來讓其他的執行緒執行. 當乙個執行緒為另乙個執行緒主動出讓執行權的時候, 它就建立了自己的wait狀態. 如果這樣的執行緒很多, 那麼就明顯地意味著存在著cpu的壓力.

可以通過下面的語句來檢視系統中有多少runnable的task.

select scheduler_id, 

current_tasks_count,

runnable_tasks_count,

work_queue_count,

pending_disk_io_count

from

sys.

dm_os_schedulers

where scheduler_id < 255

go

如果長時間持續地發現兩位數的runnable_tasks_count, 注意不是偶爾, 你就知道cpu存在壓力了.

當然, 加cpu是簡單的解決方案. 但是, 當這麼做不可行的時候, 就可以通過文章最前面的語句來找到占用cpu資源最多的query, 進行必要的優化.

資訊**

sql server – sos_scheduler_yield – wait type – day 8 of 28

Sql語句裡的遞迴查詢

以前使用oracle,覺得它的遞迴查詢很好用,就研究了一下sqlserver,發現它也支援在sql裡遞迴查詢 舉例說明 sqlserver2005版本的sql如下 比如乙個表,有id和pid欄位,id是主鍵,pid表示它的上級節點,表結構和資料 create table aaa id int nul...

Mapper裡的sql語句註解

一 tab user.id,tab user.name,age,address r.id r id,r.name r name,r.userid 這兩個相當於把需要的字段舉例出來,以便後面使用。比如,根據id使用它,相當於貼上裡面的內容資訊一樣。select from tab user left j...

Sql語句裡的遞迴查詢

sql語句裡的遞迴查詢 sqlserver2005和oracle 兩個版本 以前使用oracle,覺得它的遞迴查詢很好用,就研究了一下sqlserver,發現它也支援在sql裡遞迴查詢 舉例說明 sqlserver2005版本的sql如下 比如乙個表,有id和pid欄位,id是主鍵,pid表示它的上...