SQL Server Bekleyen İşler – sys.dm_os_waiting_tasks DMV

SQL Server özellikle yoğun ve taleplere yavaş yanıt verdiği durumlarda tam olarak durumu tespit etmek için çeşitli yöntemler bulunmaktadır. Bu yöntemlerden biri de sistem üzerindeki bloke durumları ve bekleme modunda işlemleri görmektir. Bu noktada SQL Server 2005 ile birlikte gelen sys.dm_os_waiting_tasks dynamic view nesnesi sistemde kaynakları bekleyen task’leri listeler. Kuyrukta bekleyen tüm işleri listeleyelim.

SELECT COUNT(*) AS 'Bekleyen Task Sayısı'
FROM sys.dm_os_waiting_tasks;

Bunların hangi işlemler olduğunu listeleyelim.

SELECT CAST(wait_type AS VARCHAR(40)) AS 'Bekleyen Task Türü',
       COUNT (*) AS 'Task Sayısı'
FROM sys.dm_os_waiting_tasks
GROUP BY wait_type
ORDER BY 1 DESC;


66 nolu oturumda aşağıdaki gibi açık bir transaction oluşturalım.

BEGIN TRANSACTION
UPDATE Satis
  SET Tutar = 999
  WHERE Lokasyon='L1'

Başka bir oturum penceresinde Satis tablosunu okumaya çalışalım (SPID=57). Bu işlem esnasında sistem üzerindeki IO kuyruklarına bakalım.

SELECT waiting_task_address AS 'Task address',
       session_id AS 'Session',
       exec_context_id AS 'Context',
       wait_duration_ms AS 'Wait in millsec',
       CAST(wait_type AS VARCHAR(30)) AS 'Type',
       resource_address AS 'Resource address',
       blocking_task_address AS 'Blocking task',
       blocking_session_id AS 'Blocking session',
       CAST(resource_description AS VARCHAR(30)) AS 'Resource'
FROM sys.dm_os_waiting_tasks
WHERE session_id>50


Görüldüğü gibi 57 nolu oturumu 66 nolu oturumdaki işin bitmesini 124611 milisaniye süredir beklemektedir. Bu kitlemenin hangi veritabanı ve nesnede gerçekleştiği bilgisi sys.dm_tran_locks view’inden okunabilir. Bunun için yapılması gereken sys.dm_os_waiting_tasks (resource_address) ile sys.dm_tran_locks (lock_owner_address) nesnelerini parantez içerisinde belirlenmiş kolonlar üzerinden JOIN etmek yeterli olacaktır. Örneğimizde resource_address alanının değeri 0×0000000C39E75540 olarak görünmektedir.

SELECT DB_NAME(resource_database_id) as DBName, resource_type,
resource_description, request_mode,  request_type, request_status,
object_name(b.object_id) requested_object_name
FROM sys.dm_tran_locks a LEFT JOIN sys.partitions b ON a.resource_associated_entity_id=b.hobt_id
WHERE lock_owner_address=0x0000000C39E75540

Kilit işlemi AK veritabanındaki Satis objesi üzerinde gerçekleşmiş.

Buna bağlı olarak sistem üzerindeki tüm lock’ları oturum bilgileriyle birlikte almak için aşağıdaki örnek script kullanılabilir.

SELECT DTL.resource_type,
CASE
WHEN DTL.resource_type IN (‘DATABASE’, ‘FILE’, ‘METADATA’) THEN DTL.resource_type
WHEN DTL.resource_type = ‘OBJECT’ THEN OBJECT_NAME(DTL.resource_associated_entity_id, SP.[dbid])
WHEN DTL.resource_type IN (‘KEY’, ‘PAGE’, ‘RID’) THEN
(
SELECT OBJECT_NAME([object_id])
FROM sys.partitions
WHERE sys.partitions.hobt_id =
DTL.resource_associated_entity_id
)
ELSE ‘Unidentified’
END AS requested_object_name, DTL.request_mode, DTL.request_status,
DEST.TEXT, SP.spid, SP.blocked, SP.status, SP.loginame
FROM sys.dm_tran_locks DTL
INNER JOIN sys.sysprocesses SP
ON DTL.request_session_id = SP.spid
CROSS APPLY sys.dm_exec_sql_text(SP.sql_handle) AS DEST
WHERE SP.dbid = DB_ID()
AND DTL.[resource_type]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir