Para monitorar e otimizar o desempenho de bancos de dados no Azure SQL, é necessário entender os mecanismos que o Azure oferece para garantir que os recursos de SQL estejam sempre em funcionamento otimizado. A seguir, discutimos as melhores práticas e ferramentas recomendadas para monitoramento e otimização do desempenho, bem como como configurar e usar as ferramentas nativas disponíveis para esse fim.

Ao configurar o ambiente de monitoramento no Azure SQL, o administrador precisa, primeiro, garantir que as conexões com o banco de dados estejam configuradas corretamente. A string de conexão do banco de dados inclui, entre outros dados, o nome do servidor, o número da porta SQL (1433), o nome do banco de dados e o ID de autenticação do SQL, além da senha associada. Esses parâmetros são essenciais para permitir que o agente de monitoramento do Azure SQL se conecte corretamente aos bancos de dados. A configuração pode ser feita através do Azure Key Vault, que armazena informações sensíveis, como senhas e chaves, para que possam ser usadas de forma segura.

Após a configuração, o agente de monitoramento do Azure SQL estabelece conexões TCP com os serviços SQL do Azure ou com as VMs executando o SQL Server. No entanto, é importante que as regras de firewall ou grupos de segurança que possam bloquear o acesso do agente de monitoramento ao banco de dados sejam ajustadas para permitir essa conexão. Caso contrário, o monitoramento da infraestrutura será comprometido.

Uma ferramenta recomendada pela Microsoft para o monitoramento de desempenho no Azure SQL é o Database Watcher. Com o fim do SQL Insights, o Database Watcher passou a ser a principal solução para monitorar o desempenho de bancos de dados SQL no Azure. Ele coleta dados de monitoramento de bancos de dados, instâncias gerenciadas e pools elásticos selecionados pelo administrador, e armazena essas informações em um repositório centralizado, como o Azure Data Explorer. Para utilizar o Database Watcher, o administrador deve criar um recurso do tipo "watcher" e configurá-lo para monitorar os alvos SQL desejados. Os dados de monitoramento podem ser acessados posteriormente através de dashboards do Azure, proporcionando uma visão detalhada sobre o desempenho do banco de dados.

Além disso, o Azure SQL também oferece outra abordagem de monitoramento através dos Extended Events. Essa solução oferece um nível de granularidade elevado, permitindo que os administradores monitorem condições específicas que afetam o desempenho do SQL, como consultas lentas, problemas de desempenho de I/O e utilização ineficiente de memória. Os Extended Events são configurados no SQL Server Management Studio (SSMS), onde o administrador pode criar uma sessão e selecionar os eventos que deseja monitorar. Esses eventos podem ser de natureza administrativa, operacional, analítica ou de depuração, dependendo do que precisa ser observado.

Ao configurar os Extended Events, é possível selecionar quais dados específicos serão capturados. O administrador pode escolher eventos específicos de uma lista predefinida ou criar um conjunto de eventos personalizados. Além disso, é possível filtrar esses eventos para capturar apenas aqueles que têm determinados valores, o que permite que o monitoramento seja altamente específico e relevante para a situação em questão.

Outra funcionalidade importante é o Query Store, que está disponível em todas as versões do Azure SQL Database e Azure SQL Managed Instance. O Query Store mantém um registro detalhado das consultas executadas, dos planos de execução considerados pelo servidor e das estatísticas geradas durante a execução das consultas. Com essas informações, os administradores podem otimizar o desempenho das consultas e solucionar problemas relacionados ao tempo de execução.

O Query Store é ativado por padrão nas novas instalações do Azure SQL e do SQL Server 2022. Para usá-lo, o administrador deve acessar as propriedades do banco de dados através do SSMS, e configurar o modo de operação do Query Store, que pode ser "Somente leitura" ou "Leitura e gravação". A escolha do modo influencia diretamente a forma como o SQL Server interage com o Query Store. No modo "Leitura e gravação", o servidor SQL pode adicionar novas consultas ao repositório, facilitando a análise de tendências e o desempenho das consultas ao longo do tempo.

Ao revisar o desempenho das consultas, o administrador pode identificar sessões que causam bloqueios ou problemas de desempenho e implementar alterações nos índices ou nos planos de execução para melhorar o tempo de resposta. O uso de hints de consulta também pode ser considerado, uma vez que eles permitem otimizar ainda mais o desempenho das consultas com base no uso de recursos do sistema.

Em resumo, as ferramentas fornecidas pelo Azure SQL, como o Database Watcher, os Extended Events e o Query Store, são essenciais para garantir a performance otimizada dos bancos de dados. Elas permitem uma monitoração detalhada das consultas, identificando gargalos e proporcionando a base necessária para a execução de ajustes e melhorias contínuas no ambiente SQL.

Além disso, a gestão adequada das permissões de acesso e da configuração de rede também desempenha um papel fundamental no sucesso do monitoramento e na segurança dos dados. É essencial que os administradores se familiarizem com as melhores práticas de segurança ao trabalhar com o Azure SQL, garantindo que apenas os usuários autorizados tenham acesso aos recursos críticos, como senhas e dados sensíveis, armazenados no Key Vault.

Como Resolver Bloqueios e Melhorar o Desempenho no Azure SQL e SQL Server

O gerenciamento de transações em bancos de dados pode, muitas vezes, resultar em bloqueios que afetam o desempenho geral do sistema. A ausência de um comando de COMMIT após a execução de uma transação, por exemplo, pode deixar os dados permanentemente bloqueados, impactando a acessibilidade e integridade das informações. Este tipo de problema pode ser detectado e corrigido de forma eficaz com o uso adequado das ferramentas disponíveis nos sistemas de gerenciamento de banco de dados, como o Azure SQL Database e o SQL Server.

Quando um desenvolvedor inicia uma transação no banco de dados com o comando BEGIN TRANSACTION, o objetivo é realizar uma modificação de dados, mas sem a inclusão do comando COMMIT TRANSACTION, a transação não é finalizada corretamente. Como resultado, os dados ficam bloqueados, criando um "gargalo" que impede outras operações de acesso a esses registros. No exemplo a seguir, uma atualização na tabela salesdb.address não será registrada devido à ausência do comando COMMIT TRANSACTION:

sql
BEGIN TRANSACTION
UPDATE salesdb.address SET city = "New York" WHERE city = "NY"

Embora a instrução UPDATE altere os dados na tabela, a falta do COMMIT impede que essas alterações sejam efetivamente salvas, resultando em um bloqueio persistente dos dados. Esse tipo de erro é comum em sistemas que requerem transações complexas e é essencial para os administradores de banco de dados compreenderem como gerenciar essas situações.

A solução para o problema de bloqueio envolve a análise e identificação da transação que está causando o bloqueio. No contexto do Azure SQL Database e do SQL Server, essa análise pode ser realizada por meio de consultas aos objetos de gerenciamento dinâmico (DMOs). Esses objetos, que podem ser vistas dinâmicas de gerenciamento (DMVs) ou funções de gerenciamento dinâmico (DMFs), fornecem informações detalhadas sobre as transações que estão sendo executadas, permitindo aos administradores identificar a origem do bloqueio e adotar as medidas corretivas necessárias.

Por exemplo, uma consulta utilizando as DMVs pode localizar as sessões que estão executando consultas que bloqueiam outros processos. O script a seguir utiliza as DMVs sys.dm_exec_sessions e sys.dm_exec_requests para identificar as sessões bloqueadas e suas causas:

sql
WITH cteBL (session_id, blocking_these) AS ( SELECT s.session_id, blocking_these = x.blocking_these FROM sys.dm_exec_sessions s CROSS APPLY (
SELECT ISNULL(CONVERT(VARCHAR(6), er.session_id), '')
FROM sys.dm_exec_requests AS er WHERE er.blocking_session_id = ISNULL(s.session_id, 0) AND er.blocking_session_id <> 0 FOR XML PATH('') ) AS x (blocking_these) ) SELECT s.session_id, blocked_by = r.blocking_session_id, bl.blocking_these, t.text, input_buffer = ib.event_info, * FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_requests r ON r.session_id = s.session_id INNER JOIN cteBL AS bl ON s.session_id = bl.session_id OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t OUTER APPLY sys.dm_exec_input_buffer(s.session_id, NULL) AS ib WHERE blocking_these IS NOT NULL OR r.blocking_session_id > 0 ORDER BY LEN(bl.blocking_these) DESC, r.blocking_session_id DESC

Esse script pode ser executado para diagnosticar as sessões que estão causando bloqueios e ajudar o administrador a tomar medidas para resolver o problema.

Além disso, as ferramentas de monitoramento do SQL Server, como o SQL Server Management Studio (SSMS), oferecem uma maneira prática de visualizar e diagnosticar transações bloqueadas diretamente. Através do Activity Monitor no SSMS, é possível acessar relatórios detalhados sobre todas as transações que estão bloqueando recursos no servidor. Um exemplo disso é o relatório "Activity - All Blocking Transactions", que fornece uma lista das transações responsáveis por bloqueios.

Outro recurso fundamental para a análise de problemas de desempenho são as DMVs, que oferecem informações sobre o uso de recursos, como CPU, memória e I/O, e permitem uma visão detalhada sobre o que está acontecendo dentro do servidor. O DMV sys.dm_db_resource_stats, por exemplo, fornece informações sobre o uso de recursos de forma granular, permitindo aos administradores monitorar o desempenho em tempo real:

sql
SELECT * FROM sys.dm_db_resource_stats

Além de monitorar o uso de recursos, as DMVs também oferecem dados sobre as consultas em execução (sys.dm_exec_requests), sessões ativas (sys.dm_exec_sessions) e os índices que estão sendo utilizados, o que é essencial para entender onde podem existir gargalos no desempenho do banco de dados.

Outro aspecto importante do desempenho em bancos de dados relacionais é o uso eficiente de índices. O Azure SQL Database, por exemplo, oferece recursos automáticos, como a função de Tuning Automático, que utiliza machine learning para analisar o desempenho das consultas e sugerir alterações em índices para melhorar o desempenho geral. Essa funcionalidade pode criar, alterar ou até mesmo excluir índices conforme necessário, dependendo da carga de trabalho e do desempenho observado.

O recurso de Tuning Automático no Azure SQL Database pode, por exemplo, sugerir a criação de um índice para melhorar o desempenho de uma consulta específica, criando esse índice automaticamente quando os recursos do banco estiverem disponíveis. Esse tipo de ajuste automático pode evitar problemas de desempenho causados por consultas mal otimizadas e ajudar a manter o banco de dados em funcionamento de maneira eficiente.

Entender como utilizar as DMVs e as ferramentas de monitoramento adequadas para identificar e resolver problemas de bloqueio e desempenho é fundamental para qualquer administrador de banco de dados. Além disso, o uso adequado de índices e a análise constante do desempenho das consultas podem garantir que o banco de dados esteja operando de maneira ideal, prevenindo problemas futuros antes que eles se tornem críticos.