Поиск объектов с наибольшим количеством блокировок

Административные скрипты MS SQL > Поиск объектов с наибольшим количеством блокировок
26.12.2018 22:51:24


Наиболее часто встречающиеся слова в статье:

[session] [LockCounts] [lock_count] [objstats] [objects] [server_event_sessions] [DECLARE] [nvarchar] [object_id] [''bigint'']


Статья:

USE MDM_Light 
-- Find objects in a particular database that have the most  
-- lock acquired. This sample uses AdventureWorksDW2012.  
-- Create the session and add an event and target.  
--   
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name=''LockCounts'')  
DROP EVENT session LockCounts ON SERVER  
GO  
DECLARE @dbid int  
 
SELECT @dbid = db_id(''MDM_Light'')  
 
DECLARE @sql nvarchar(1024)  
SET @sql = ''  
CREATE event session LockCounts ON SERVER  
ADD EVENT sqlserver.lock_acquired (WHERE database_id ='' + CAST(@dbid AS nvarchar) +'')  
ADD TARGET package0.histogram(   
SET filtering_event_name=''''sqlserver.lock_acquired'''', source_type=0, source=''''resource_0'''')''  
 
EXEC (@sql)  
GO  
ALTER EVENT session LockCounts ON SERVER   
STATE=start  
GO  
 
--  Исследуем
SELECT name, object_id, lock_count FROM   
(SELECT objstats.value(''.'',''bigint'') AS lobject_id,   
objstats.value(''@count'', ''bigint'') AS lock_count  
FROM (  
SELECT CAST(xest.target_data AS XML)  
LockData  
FROM sys.dm_xe_session_targets xest  
JOIN sys.dm_xe_sessions xes ON xes.address = xest.event_session_address  
JOIN sys.server_event_sessions ses ON xes.name = ses.name  
WHERE xest.target_name = ''histogram'' AND xes.name = ''LockCounts''  
) Locks  
CROSS APPLY LockData.nodes(''//HistogramTarget/Slot'') AS T(objstats)  
 ) LockedObjects   
INNER JOIN sys.objects o  
ON LockedObjects.lobject_id = o.object_id  
WHERE o.type != ''S'' AND o.type = ''U''  
ORDER BY lock_count desc  
GO  
--   
-- Stop the event session.  
--   
ALTER EVENT SESSION LockCounts ON SERVER  
state=stop  
GO