Sorgu yürütme planı varsayılan olarak kilitleme ayrıntılarını göstermez, bir sorgunun yürütülmesi sırasında alınan türle birlikte kilitleri görüntülemek mümkün müdür?
Sorgu yürütme planı varsayılan olarak kilitleme ayrıntılarını göstermez, bir sorgunun yürütülmesi sırasında alınan türle birlikte kilitleri görüntülemek mümkün müdür?
Yanıtlar:
sorgunun yürütülmesi sırasında edinilen kilitlerin türüyle birlikte görüntülenmesi mümkün müdür?
Evet, kilitleri belirlemek için,
Erland Sommarskog tarafından kullanabilirsinizbeta_lockinfo
beta_lockinfo
işlemler ve sahip oldukları kilitler ve bunların etkin işlemleri hakkında bilgi sağlayan saklı bir yordamdır.beta_lockinfo
engelleme durumu hakkında olabildiğince fazla bilgi toplamak üzere tasarlanmıştır, böylece durumun çaresiz olması durumunda suçluyu anında bulabilir ve engelleme sürecini öldürebilirsiniz. Daha sonra arkanıza yaslanıpbeta_lockinfo
engelleme durumunun nasıl ortaya çıktığını anlamak ve durumun tekrarlanmasını önlemek için hangi önlemlerin alınacağını anlamak için çıktıyı analiz edebilirsiniz . Çıktıbeta_lockinfo
, tüm aktif süreçlerin yanı sıra kilitli pasif süreçleri, hangi nesneleri kilitlediklerini, en son hangi komutu gönderdiklerini ve hangi ifadeyi yürüttüklerini gösterir. Mevcut ifadeler için sorgu planları da alırsınız. Normalde koşarsınbeta_lockinfo
çıktıya doğrudan bakmak için, ancak verilerin tabloya kaydedildiği bir arşiv modu da vardır . Bu, en azından kullanışlı değildir, birisinin çıktıyıbeta_lockinfo
kendinize erişemediğiniz bir siteden göndermesini istiyorsanız .
Başka bir yöntem kullanmaktır sp_whoIsActiveAdam Machanic ile birlikte@get_locks = 1
EXEC sp_WhoIsActive
@filter = '',
@filter_type = 'session',
@not_filter = '',
@not_filter_type = 'session',
@show_own_spid = 0,
@show_system_spids = 0,
@show_sleeping_spids = 1,
@get_full_inner_text = 0,
@get_plans = 1,
@get_outer_command = 1,
@get_transaction_info = 0,
@get_task_info = 1,
@get_locks = 1, ----------> 1 = ON (get lock info); 0 = OFF
@get_avg_time = 0,
@get_additional_info = 0,
@find_block_leaders = 0,
@delta_interval = 0,
@output_column_list = '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]',
@sort_order = '[start_time] ASC',
@format_output = 1,
@destination_table = '',
@return_schema = 0,
@schema = NULL,
@help = 0
İşte süreç / tablo / kilit türüne göre kilitlere nasıl bakacağım:
SELECT
HostName,
"OS UserName",
Login,
spid,
"Database",
TableID,
"Table Name_________",
IndID,
-- [Index Name],
"Lock Type",
"Lock Mode",
Status,
-- Resource,
Count(*) AS "Lock Count"
FROM (
SELECT
Convert(VarChar(30), RTRIM(P.HostName)) AS HostName,
Convert(VarChar(30), RTRIM(P.nt_UserName)) AS "OS UserName",
Convert(VarChar(30), Suser_SName(p.sid)) AS Login,
Convert(SmallInt, req_spid) AS spid,
Convert(VarChar(30), DB_Name(rsc_dbid)) AS "Database",
rsc_objid AS TableID,
Convert(VarChar(30), Object_Name(rsc_objid, rsc_dbid))
AS [Table Name_________],
rsc_indid AS IndID,
CASE SubString (lock_type.name, 1, 4)
When '' Then 'None'
When 'DB' Then 'Database'
When 'FIL' Then 'File'
When 'IDX' Then 'Index'
When 'TAB' Then 'Table'
When 'PAG' Then 'Page'
When 'KEY' Then 'Key'
When 'EXT' Then 'Extent'
When 'RID' Then 'Row ID'
When 'APP' Then 'Application'
Else SubString (lock_type.name, 1, 4)
END AS "Lock Type",
Case SubString (lock_mode.name, 1, 12)
When NULL Then 'N/A'
When 'Sch-S' Then 'SCHEMA (Stability)'--'SCHEMA stability lock'
When 'Sch-M' Then 'SCHEMA (Modification)'--'SCHEMA modification lock'
When 'S' Then 'SHARED'--'SHARED Lock acquisition'
When 'U' Then 'UPDATE'--'UPDATE lock acquisition'
When 'X' Then 'EXCLUSIVE'--'EXCLUSIVE lock granted'
When 'IS' Then 'SHARED (Intent)'--'INTENT for SHARED lock'
When 'IU' Then 'UPDATE (Intent)'--'INTENT for UPDATE lock'
When 'IX' Then 'EXCLUSIVE (Intent)'--'INTENT for EXCLUSIVE lock'
When 'SIU' Then 'SHARED (Intent UPDATE)'--'SHARED lock with INTENT for UPDATE'
When 'SIX' Then 'SHARED (Intent EXCLUSIVE)'--'SHARED lock with INTENT for EXCLUSIVE'
When 'UIX' Then 'UPDATE'--'UPDATE lock with INTENT for EXCLUSIVE'
When 'BU' Then 'UPDATE (BULK)'--'BULK UPDATE lock'
Else SubString (lock_mode.name, 1, 12)
END AS "Lock Mode",
SubString(lock_status.name, 1, 5) AS Status,
SubString (rsc_text, 1, 16) AS Resource
FROM
Master..SysLockInfo S
JOIN Master..spt_values lock_type on S.rsc_type = lock_type.number
JOIN Master..spt_values lock_status on S.req_status = lock_status.number
JOIN Master..spt_values lock_mode on S.req_mode = lock_mode.number -1
JOIN Master..SysProcesses P on S.req_spid = P.spid
WHERE
lock_type.type = 'LR'
AND lock_status.type = 'LS'
AND lock_mode.type = 'L'
AND DB_Name(rsc_dbid) NOT IN ('master', 'msdb', 'model')
) AS X
WHERE TableID > 0
GROUP BY
HostName,
"OS UserName",
Login,
spid,
"Database",
TableID,
"Table Name_________",
IndID,
"Lock Type",
"Lock Mode",
Status
ORDER BY
spid, "Database", "Table Name_________", "Lock Type", Login
Sp_lock veya sys.dm_tran_locks kullanarak bir oturumun kilitlerini görüntüleyebilirsiniz. Her iki şekilde de oturuma göre filtre uygulayabilirsiniz. Bunu yapmak için Genişletilmiş Olaylar'ı da kullanabilirsiniz.
Evet, sorgu yürütme sırasında kilitleri ve türünü
Adam mekaniğinin SP_whoisactive görüntülemek için buraya tıklayın
Üstelik burada bir blok raporu oluşturmak istiyorsanız, burada açıklanan iz yardımı ile yapabilirsiniz.
performance counters
size örnek olarak geniş bir davranış verecektir. OP sorgu düzeyinde istiyor.