Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Os administradores de bases de dados muitas vezes precisam de identificar a origem dos bloqueios que dificultam o desempenho da base de dados.
Por exemplo, está a monitorizar o seu servidor de produção à procura de possíveis gargalos. Suspeitas que possam existir recursos altamente contestados e gostarias de saber quantos bloqueios são usados nesses objetos. Uma vez identificados os objetos mais frequentemente bloqueados, podem ser tomadas medidas para otimizar o acesso aos objetos contestados.
Para isso, use o Query Editor no SQL Server Management Studio.
Para encontrar os objetos que têm mais fechaduras
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 anterior corre no SQL Server localmente, mas pode não correr totalmente na Azure SQL Database. As partes centrais do exemplo envolvem diretamente Eventos, como ADD EVENT sqlserver.lock_acquired trabalhar também no Azure SQL Database. Mas os itens preliminares, como sys.server_event_sessions devem ser editados para os seus equivalentes da tabela SQL do Azure, como sys.database_event_sessions para que o exemplo seja executado.
Para mais informações sobre estas pequenas diferenças entre SQL Server on-premises e Azure SQL Database, consulte os seguintes artigos:
Após as instruções do script Transact-SQL anterior terminarem, o separador Resultados do Editor de Consultas apresenta as seguintes colunas:
- nome
- object_id
- contagem_de_bloqueios
Ver também
CRIAR SESSÃO DE EVENTO (Transact-SQL)
ALTER SESSÃO DE EVENTOS (Transact-SQL)
sys.dm_xe_session_targets (Transact-SQL)
sys.dm_xe_sessions (Transact-SQL)
sys.server_event_sessions (Transact-SQL)