Monitoramento de desempenho e solução de problemas no SQL Server é um tópico vasto. No SQL Server 2005, as visualizações de gerenciamento dinâmico, também conhecidas como DMVs, foram introduzidas e se tornaram uma ferramenta de ajuda essencial para diagnosticar problemas de desempenho do SQL Server. Ao mesmo tempo, podemos usar exibições de gerenciamento dinâmico para o Banco de Dados SQL do Azure. Alguns deles podem diferir do banco de dados local do SQL Server, mas a lógica de trabalho ainda é a mesma. A Microsoft tem uma documentação muito boa sobre exibições de gerenciamento dinâmico. A única coisa, você precisa ter cuidado com a versão e validação do produto de visualizações de gerenciamento dinâmico. Como sys.dm_exec_request, está disponível para SQL Server 2008 e versões posteriores e para o banco de dados SQL do Azure, mas sys.dm_db_wait_stats é válido apenas para o banco de dados SQL do Azure.
Neste post, falaremos sobre o básico do sys.dm_exec_request. sys.dm_exec_requests é uma exibição de gerenciamento dinâmico que retorna apenas as solicitações em execução no momento. Isso significa que quando você executa a consulta sys.dm_exec_requests, ela captura a solicitação que está sendo executada naquele momento e não inclui nenhum dado histórico. Portanto, essa visualização é muito útil para monitorar solicitações em tempo real. Em outras palavras, ele dá a resposta para “o que está acontecendo no meu servidor agora?” Essa visão inclui muitos detalhes, mas discutiremos os mais importantes.
session_id :Este valor define um número de identificação de sessão. No SQL Server, os IDs de sessão iguais ou inferiores a 50 são dedicados ao processo em segundo plano.
start_time :esse valor define a data e hora de início da solicitação.
estado :Este valor define um status da solicitação. Os status disponíveis são:
- fundo
- executando
- executável
- dormindo
- suspenso
SELECT DISTINCT status FROM sys.dm_exec_requests WHERE session_id <>@@SPID
fundo :Este tipo de status define os processos em segundo plano. Alguns deles são LAZY WRITER, CHECKPOINT e LOG WRITER.
select session_id, command, os_thread_id from sys.dm_exec_requests as r join sys.dm_os_workers as w on r.task_address = w.task_address join sys.dm_os_threads as t on t.thread_address = w.thread_address where session_id <= 50 order by session_id
executando :Este tipo de status define que a solicitação está sendo processada pela CPU.
select * from sys.dm_exec_requests where status='running' and session_id <>@@SPID
executável :Este tipo de status pode ser definido simplesmente como um pedido que está esperando na fila da CPU para ser executado. Se você detectar muitos processos executáveis em sys.dm_exec_requests, isso pode ser um sintoma de pressão da CPU. Essa métrica não é suficiente para diagnosticar esse problema de desempenho da CPU. Por esse motivo, precisamos apoiar este caso com mais evidências. Isso é significativo para provarmos nossa teoria. A exibição de gerenciamento dinâmico sys.dm_os_wait_stats inclui uma coluna que é signal_wait_time_ms. Este valor de coluna pode ajudar a determinar o problema da CPU. A consulta a seguir nos mostra a porcentagem de Signalwait. Se essa métrica tiver um valor alto, provavelmente você está enfrentando um problema de desempenho da CPU. Você pode aprofundar sua revisão dessa maneira.
---https://sqlserverperformance.wordpress.com/page/146/ ---Glenn Berry's SQL Server Performance SELECT signal_wait_time_ms=SUM(signal_wait_time_ms) ,'%signal (cpu) waits' = CAST(100.0 * SUM(signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) ,resource_wait_time_ms=SUM(wait_time_ms - signal_wait_time_ms) ,'%resource waits'= CAST(100.0 * SUM(wait_time_ms - signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) FROM sys.dm_os_wait_stats;
suspenso :Este tipo de status define o processo de espera de algum recurso. Pode ser I/O, LOCK e LATCH etc. Conforme mencionado acima, podemos usar o sys.dm_os_wait_stats visualização de gerenciamento dinâmico para detectar wait_time_ms.
dormindo :significa que a solicitação está conectada ao SQL Server, mas não está executando nenhum comando no momento.
comando :Esta coluna define um tipo de comando que está sendo executado. Ao mesmo tempo, podemos encontrar informações adicionais para comandos específicos que são uma taxa de conclusão. De acordo com os livros online, estes são;
ALTER INDEX REORGANIZE
Opção AUTO_SHRINK com ALTER DATABASE
BANCO DE DADOS DE BACKUP
DBCC CHECKDB
DBCC CHECKFILEGROUP
TABELA DE VERIFICAÇÃO DBCC
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECUPERAÇÃO
RESTAURAR BANCO DE DADOS
RECUPERAR
CRIPTOGRAFIA TDE
Demonstração :
- Conecte o banco de dados mestre e inicie o backup para qualquer banco de dados.
BACKUP DATABASE WideWorldImporters TO DISK ='NUL'
Dica :Quando você leva o backup do banco de dados para o dispositivo “NUL”, o SQL Server não grava um arquivo de backup em nenhum lugar e você evita a exclusão de um arquivo de backup de teste. Mas não use este comando em seu ambiente de produção. Isso pode causar a quebra da cadeia LSN.
Execute a seguinte consulta:
SELECT command,percent_complete ,* FROM sys.dm_exec_requests WHERE session_id <>@@SPID and session_id>50 and command='BACKUP DATABASE'
sql_handle :Este valor define a instrução SQL da solicitação. Mas esse valor está no formato bitmap. Por esse motivo, precisamos usar a função com valor de tabela sys.dm_exec_sql_text para converter o valor em texto significativo.
select session_id ,command , sqltxt.text ,database_id from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt where session_id<>@@SPID AND session_id>50
database_id :Este valor define qual banco de dados faz a solicitação. Podemos juntar este campo com sys.databases para obter o nome do banco de dados.
select session_id ,command , sqltxt.text ,db.name from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt inner join sys.databases db on db.database_id = req.database_id where session_id<>@@SPID AND session_id>50
wait_type :Este valor define o tipo de espera atual da solicitação. Se a duração da execução da consulta demorar mais do que o esperado, você poderá verificar e determinar o tipo de espera da consulta.
transaction_isolation_level :Este valor define o nível de transação da consulta enviada:
0=Não especificado
1=Ler não confirmado
2=Ler Confirmado
3=Repetível
4=Serializável
5=Instantâneo
select session_id ,command , sqltxt.text ,db.name,req.status,wait_type ,transaction_isolation_level, CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncomitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS isolation_level_name from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt inner join sys.databases db on db.database_id = req.database_id where session_id<>@@SPID AND session_id>50
blocking_session_id :É o id da sessão que está bloqueando a solicitação. Se esta coluna for NULL, a solicitação não bloqueou nenhuma sessão.
Demonstração :
- Abra o SQL Server Management Studio e execute a seguinte consulta.
DROP TABLE IF EXISTS TestPerfomon GO CREATE TABLE TestPerfomon (ID INT , Nm VARCHAR(100)) INSERT INTO TestPerfomon VALUES(1,1) GO BEGIN TRAN UPDATE TestPerfomon SET Nm='2' WHERE ID=1 SELECT @@SPID AS blocking_session_id
Abra uma nova janela de consulta e execute a seguinte consulta.
SET TRANSACTION ISOLATION LEVEL Serializable BEGIN TRAN UPDATE TestPerfomon SET Nm='3' WHERE ID=1
Abra outra nova janela de consulta e execute esta consulta DMV.
select session_id ,command , sqltxt.text ,db.name,req.status,wait_type ,transaction_isolation_level, CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncomitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS isolation_level_name , blocking_session_id from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt inner join sys.databases db on db.database_id = req.database_id where session_id<>@@SPID AND session_id>50
Com esta demonstração, descobrimos o motivo pelo qual a segunda consulta está bloqueada e qual sessão está bloqueada a solicitação. Ao executar sp_BlitzWho 65, você pode descobrir os detalhes do bloqueio e os detalhes da sessão bloqueada.
sp_BlitzWho 65
Nesta demonstração, recuperamos os detalhes do bloqueio e das sessões bloqueadas e, ao mesmo tempo, obtivemos os detalhes sobre essas sessões. Esta é uma demonstração muito básica, mas mostra como o problema pode ser resolvido.
Neste post, falamos sobre sys.sys.dm_exec_requests. Essa visualização de gerenciamento dinâmico nos dá a flexibilidade de obter um instantâneo durante a linha atual de uma solicitação. Além disso, esses dados de detalhes podem nos ajudar ou nos guiar pelo processo de descoberta do problema.
Referências
- sys.dm_exec_requests (Transact-SQL)
- Monitorando o Banco de Dados SQL do Azure usando exibições de gerenciamento dinâmico
- sys.dm_db_wait_stats (Banco de Dados SQL do Azure)
Ferramenta útil:
dbForge Monitor – add-in para Microsoft SQL Server Management Studio que permite rastrear e analisar o desempenho do SQL Server.