क्वेरी निष्पादन योजना डिफ़ॉल्ट रूप से लॉकिंग विवरण नहीं दिखाती है, क्या क्वेरी के निष्पादन के दौरान प्राप्त किए गए प्रकारों के साथ-साथ लॉक को देखना संभव है?
क्वेरी निष्पादन योजना डिफ़ॉल्ट रूप से लॉकिंग विवरण नहीं दिखाती है, क्या क्वेरी के निष्पादन के दौरान प्राप्त किए गए प्रकारों के साथ-साथ लॉक को देखना संभव है?
जवाबों:
क्या किसी क्वेरी के निष्पादन के दौरान प्राप्त किए गए प्रकारों के साथ-साथ ताले को देखना संभव है?
हां, तालों के निर्धारण के लिए,
आप Erland Sommarskog द्वारा उपयोग कर सकते हैंbeta_lockinfo
beta_lockinfoएक संग्रहीत प्रक्रिया है जो प्रक्रियाओं और उन तालों के बारे में जानकारी प्रदान करती है जो वे अपने सक्रिय लेनदेन के साथ रखते हैं।beta_lockinfoसंभव के रूप में एक अवरुद्ध स्थिति के बारे में अधिक से अधिक जानकारी इकट्ठा करने के लिए डिज़ाइन किया गया है, ताकि आप तुरंत अपराधी को ढूंढ सकें और यदि स्थिति हताश हो तो अवरुद्ध प्रक्रिया को मार सकें। तब आप वापस बैठ सकते हैं औरbeta_lockinfoयह समझने के लिए आउटपुट से विश्लेषण कर सकते हैं कि अवरुद्ध स्थिति कैसे उत्पन्न हुई और स्थिति को फिर से समझने से रोकने के लिए क्या कार्रवाई की गई। आउटपुट सेbeta_lockinfoसभी सक्रिय प्रक्रिया के साथ-साथ ताले के साथ निष्क्रिय प्रक्रियाएं दिखाई देती हैं, वे किन वस्तुओं को लॉक करते हैं, वे किस कमांड को अंतिम रूप से प्रस्तुत करते हैं और वे किस स्टेटमेंट को निष्पादित कर रहे हैं। आपको वर्तमान कथनों के लिए क्वेरी प्लान भी मिलते हैं। आम तौर पर, आप चलाते हैंbeta_lockinfoआउटपुट को सीधे देखने के लिए, लेकिन एक संग्रह मोड भी है जहां डेटा को टेबल पर सहेजा जाता है। यह कम से कम उपयोगी नहीं है, यदि आप चाहते हैं कि कोई व्यक्ति आपको उसbeta_lockinfoसाइट से आउटपुट भेज सके , जिसकी आपको स्वयं तक पहुँच नहीं है।
एक अन्य विधि का उपयोग है sp_whoIsActiveएडम Machanic द्वारा साथ@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यहाँ मैं ताले को प्रक्रिया / तालिका / लॉक प्रकार से देखता हूँ:
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 या sysinos_tran_locks का उपयोग करके सत्र के लिए ताले देख सकते हैं। दोनों तरीकों से आप सत्र द्वारा फ़िल्टर कर सकते हैं। आप ऐसा करने के लिए विस्तारित ईवेंट का भी उपयोग कर सकते हैं।
हाँ, आप क्वेरी निष्पादन के दौरान ताले और उसके प्रकार को देख सकते हैं
एडम यांत्रिकी के SP_whoisactive देखने के लिए यहां क्लिक करें
इसके अलावा अगर आप अपने साथ एक ब्लॉक रिपोर्ट बनाना चाहते हैं तो आप ट्रेस की मदद से यहाँ बताए गए तरीके से कर सकते हैं
performance countersबस आपको व्यापक व्यवहार प्रदान करेगा। ओपी क्वेरी स्तर पर चाहता है।