如何偵查SQL執行狀態
引出問題
隨著菜鳥一點點的成熟,現在老鳥已經開始慢慢的將一些問題拋給他:“菜鳥,你去研究下如何有效而快捷的偵查SQL執行狀態?”。
“鳥哥,你交代的任務,我分分鐘就去辦。”,菜鳥領了任務趕緊忙碌起來。
分析問題
“其實這個場景經常遇到,比如:我們想知道某個程式的SQL查詢執行到哪一步了?當前執行多久了?查詢是從哪個登入使用者哪一個機器過來的?跑的是什麼業務?甚至執行計劃是什麼樣子?老鳥就是老鳥,總想的比我們遠”。菜鳥一邊尋思著,一邊又馬不停蹄的問G哥,終於功夫不負有心人,總算有了點眉目。
解決問題
利用一系列的常見系統檢視就可以很輕鬆的解決這個問題:
- sys.dm_exec_requests:這個動態檢視可以拿到所有於執行請求的資訊
- sys.dm_exec_sql_text:這個動態檢視可以拿到執行的語句和當前執行的語句
- sys.dm_exec_query_plan:這個動態檢視可以拿到執行計劃
跑在59號程式的測試程式碼
while 1 = 1
begin
print 11
waitfor delay `00:00:01`
end
偵查59號程式的程式碼如下:
use master
GO
SELECT
req.session_id
,req.start_time
,[current_time] = getdate()
,ms_since_start = DATEDIFF(ms,req.start_time,GETDATE())
,req.percent_complete
,req.total_elapsed_time
,database_name = db.name
,req.status
,login_name = suser_name(req.user_id)
,pro.hostname
,pro.program_name
,req.command
,req.reads
,req.logical_reads
,req.writes
,req.row_count
,transaction_isolation_level =
case req.transaction_isolation_level
when 0 then `Unspecified`
when 1 then `ReadUncomitted`
when 2 then `ReadCommitted`
when 3 then `Repeatable`
when 4 then `Serializable`
when 5 then `Snapshot`
else ``
end
,req.open_transaction_count
,st.text
,stat = SUBSTRING(st.text,
(req.statement_start_offset/2)+1,
(
(CASE req.statement_end_offset
WHEN - 1 THEN DATALENGTH(st.text)
ELSE req.statement_end_offset
END - req.statement_start_offset)/2
) + 1
)
,qp.query_plan
FROM sys.dm_exec_requests as req WITH(NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(req.plan_handle) qp
INNER JOIN sys.databases as db WITH(NOLOCK)
ON req.database_id = db.database_id
INNER JOIN sys.sysprocesses as pro WITH(NOLOCK)
ON req.session_id = pro.spid
WHERE session_id = 59
執行結果如下(人為分成兩段):
補充說明
當然我們也可以使用上一篇文章講到的SQL Profiler工具。但是,這種方法有個典型的缺點是對被跟蹤的SQL Server伺服器效能影響較大,不如使用動態檢視來得簡單方便快捷。
相關文章
- 請求更改狀態介面後,執行 sql 查出來狀態不對SQL
- sql查詢是如何執行的?SQL
- 執行緒狀態執行緒
- mysql操作命令梳理(5)-執行sql語句查詢即mysql狀態說明MySql
- 如何使用jstack分析執行緒狀態JS執行緒
- 如何使用 jstack 分析執行緒狀態JS執行緒
- 檢視mysql執行狀態的一些sqlMySql
- 乾貨:教你如何監控 Java 執行緒池執行狀態Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- PL/SQL執行動態SQLSQL
- Java執行緒的狀態Java執行緒
- 執行緒狀態和鎖執行緒
- 檢視BW執行狀態
- 執行緒各種狀態執行緒
- 執行緒6--執行緒的狀態執行緒
- Oracle 11g RAC 檢查各部分執行狀態Oracle
- 如何在程式執行時動態修改它的引數(狀態)?
- MySQL執行緒狀態詳解MySql執行緒
- Docker 之 執行狀態監控Docker
- Java執行緒狀態轉換Java執行緒
- MySQL MHA 執行狀態監控MySql
- 執行緒的幾種狀態執行緒
- memcached的執行狀態監控
- java--執行緒狀態【轉】Java執行緒
- Mysql複製執行緒狀態MySql執行緒
- 一條 SQL 查詢語句是如何執行的?SQL
- Java執行緒池中執行緒的狀態簡介Java執行緒
- java執行緒的五大狀態,阻塞狀態詳解Java執行緒
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- Linux如何檢視系統和程式的執行狀態?Linux
- MySQL主執行緒、從I/O執行緒和從SQL執行緒的State列常見狀態介紹MySql執行緒
- 監控 SQL Server 的執行狀況SQLServer
- Memcached 多執行緒和狀態機執行緒
- 使用 telescope 檢視 schedule 執行狀態
- ThreadPollExcutor執行緒池的狀態thread執行緒
- Java執行緒狀態及切換Java執行緒
- Java 執行緒的5種狀態Java執行緒
- 【Java】執行緒的 6 種狀態Java執行緒