Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Banco de dados SQL no Microsoft Fabric
Muitas vezes, os administradores de banco de dados precisam identificar a origem de bloqueios que estão obstruindo o desempenho do banco de dados.
Por exemplo, digamos que você esteja monitorando seu servidor de produção quanto a possíveis gargalos. Você suspeita que existem recursos altamente disputados e gostaria de saber quantos bloqueios esses objetos detêm. Uma vez identificados os objetos bloqueados com maior frequência, algumas medidas podem ser tomadas para otimizar o acesso aos objetos disputados.
Para fazer isso, use o Editor de Consultas no SQL Server Management Studio.
Para localizar os objetos que detêm a maioria dos bloqueios
No Editor de Consultas, emita as seguintes instruções:
-- Find objects in a particular database that have the most -- lock acquired. This sample uses AdventureWorksDW2022. -- 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('AdventureWorksDW2022'); 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 -- Create a simple workload that takes locks. USE AdventureWorksDW2022; GO SELECT TOP 1 * FROM dbo.vAssocSeqLineItems; GO -- The histogram target output is available from the -- sys.dm_xe_session_targets dynamic management view in -- XML format. -- The following query joins the bucketizing target output with -- sys.objects to obtain the object names. 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
Observação
O exemplo de código Transact-SQL precedente é executado no SQL Server local, mas talvez não seja executado no Banco de Dados SQL do Azure. As partes principais do exemplo que envolvem diretamente Eventos, como ADD EVENT sqlserver.lock_acquired, funcionam no Banco de Dados SQL do Azure também. Porém, os itens preliminares, como sys.server_event_sessions, devem ser editados em seus equivalentes do Banco de Dados SQL do Azure como sys.database_event_sessions para que o exemplo seja executado.
Para obter mais informações sobre essas diferenças secundárias entre o SQL Server local versus o Banco de Dados SQL do Azure, confira os seguintes artigos:
Depois que as instruções no script Transact-SQL anterior forem concluídas, a guia Resultados do Editor de Consulta exibe as seguintes colunas:
- name
- object_id
- lock_count
Confira também
CRIAR SESSÃO DE EVENTOS (Transact-SQL)
ALTER EVENT SESSION (Transact-SQL)
sys.dm_xe_session_targets (Transact-SQL)
sys.dm_xe_sessions (Transact-SQL)
sys.server_event_sessions (Transact-SQL)