Oi,
Continuarei a explicar como solucionar problemas de desempenho do SQL Server nesta série de artigos.
Solução de problemas de desempenho do SQL Server
Leia o artigo anterior antes deste.
Monitorando contadores de desempenho via PERFMON | Solução de problemas de desempenho do SQL Server -3
DMV (Exibição de gerenciamento dinâmico)
Com DMV ( Dynamic Management Views ) e DMF ( Dynamic Management Functions ) introduzidos no SQL Server 2005, você pode monitorar todas as atividades ocorridas no banco de dados, status de desempenho e exibir informações do sistema para gerenciamento e monitoramento de bancos de dados.
Todos os bancos de dados (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2, etc.) coletam algumas informações internas (atividades de sessão, processo etc. e suas estatísticas) sobre o sistema e fornecem esses dados como tabelas e visualizações do sistema.
Para obter informações sobre o SO e o Banco de Dados, as seguintes informações geralmente estão disponíveis nas tabelas do Sistema que são atualizadas periodicamente pelo SQL Server.
- Informações gerais sobre banco de dados e servidor de banco de dados (nome, edição, versão, conjunto de caracteres etc.)
- Consultas ativas
- Uso de CPU, E/S e memória de consultas ativas
- Plano de execução
- Índice usado por uma consulta em execução
- Espera de E/S na memória, disco e rede
- Índices ausentes que afetam negativamente o desempenho do banco de dados
- Taxas de uso de índices (valores de varredura, busca)
- Tempo de resposta dos discos
DMF (Função de gerenciamento dinâmico)
Embora DMV e DMF pareçam iguais no SQL Server, a diferença entre eles pode ser consultada diretamente como o nome de DMV, enquanto DMF são funções que recebem um parâmetro e retornam uma tabela de acordo.
Graças ao DMV e DMFs, você pode monitorar bancos de dados críticos em execução como Produção, identificar problemas imediatamente e agir de acordo. Com essas consultas, você pode consultar a maioria das instruções de CPU, E/S e consumo de memória de consultas em execução ativas no banco de dados, localizar as tabelas de índice ausentes e localizar consultas de execução lenta.
Todos os DMV e DMF disponíveis no SQL Server podem ser consultados com a seguinte consulta.
selecione nome,type_desc de sys.system_objects onde nome como 'dm%' ordena por nome;
Esses DMVs e DMFs usados no SQL Server fornecem informações aos usuários de acordo com Categorias como Sessão, Banco de Dados, SO (Sistema Operacional), Transação, etc. Por exemplo; DMV e DMF na categoria Banco de dados começam com sys.dm_db ou DMV e DMF relacionados a transações começam com sys.dm_tran .
A lista de DMV e DMF por categorias é a seguinte.
DMV e DMF usados mais comuns são como a seguir.
Execução (SQL, Consulta, Processo etc ): DMV e DMF de consultas em execução ativa que fornecem informações como qual usuário é chamado de qual máquina, processos, tempos de término estimados e estatísticas de consulta.
Os mais importantes são os seguintes.
- sys.dm_exec_query_stats (DMV)
- sys.dm_exec_requests (DMV)
- sys.dm_exec_sessions (DMV)
- sys.dm_exec_connections (DMV)
- sys.dm_exec_query_plan (DMF)
- sys.dm_exec_sql_text (DMF)
- sys.dm_exec_cached_plans (DMV)
- sys.dm_exec_cursors (DMF)
Banco de dados: É o DMV e o DMF que fornecem as informações necessárias sobre Índice, Espelhamento e particionamento no nível do banco de dados. Os mais importantes são os seguintes.
- sys.dm_db_missing_index_details (DMV)
- sys.dm_db_missing_index_columns ( DMF )
- sys.dm_db_missing_index_groups (DMV)
- sys.dm_db_missing_index_group_stats (DMV)
- sys.dm_db_index_usage_stats (DMV)
- sys.dm_db_index_physical_stats (DMF)
- sys.dm_db_index_operational_stats (DMF)
- dm_db_partition_stats (DMV)
- sys.dm_db_mirroring_connections (DMV)
Sistema operacional: É DMV e DMF que fornece as informações necessárias sobre o sistema operacional. Os mais importantes são os seguintes.
- sys.dm_os_sys_info (DMV)
- sys.dm_os_sys_memory(DMV)
- sys.dm_os_waiting_tasks(DMV)
- sys.dm_os_wait_stats(DMV)
- sys.dm_os_waiting_tasks (DMV)
- sys.dm_os_performance_counters(DMV)
- sys.dm_os_cluster_nodes (DMF)
- sys.dm_tran_active_transactions (DMV)
- sys.dm_tran_session_transactions (DMV)
- sys.dm_tran_database_transactions (DMV)
- sys.dm_tran_current_transaction (DMV)
selecione o top 10 case quando sql_handle IS NULL então '' else ( substring(st.text,(qs.statement_start_offset+2)/2, (case when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX))) ,st.text))*2 else qs.statement_end_offset end - qs.statement_start_offset) /2 ) ) final como query_text, qp.query_plan, (total_worker_time+0.0)/1000 como total_worker_time, (total_worker_time+0.0)/(execution_count*1000 ) como [AvgCPUTime], total_logical_reads como [LogicalReads], total_logical_writes como [logicalWrites], execution_count, creation_time, last_execution_time, total_logical_reads+total_logical_writes como [AggIO], (total_logical_reads+total_logical_writes)/(execution_count + 0.0) como [AvgIO], db_name( st.dbid) como database_name, st.objectid como object_idfrom sys.dm_exec_query_stats qs cross apply sys.dm_exec_sql_text(sql_handle) st CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp onde total_worker_time> 0 ordem por total_worker_time desc;
Quando executo a consulta acima no banco de dados de teste AdventureWorks que usei para meus testes, a saída será a seguinte.
Compartilharei o script (Incluir SO e banco de dados DMV e DMF) que fornece informações gerais sobre o SO que a instância do banco de dados SQL Server está executando, como CPU total, memória, tamanho total do disco, tamanho do banco de dados e tamanho do log de transações.
Este script é especialmente necessário ao preparar seus inventários de banco de dados.
sp_configure 'mostrar opções avançadas', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 1;GORECONFIGURE;GO/************************ ********************************/SET NOCOUNT ONDECLARE @hr intDECLARE @fso intDECLARE @drive char(1)DECLARE @ odrive intDECLARE @TotalSize varchar(20) DECLARE @MB Numérico; SET @MB =1048576CREATE TABLE #drives (drive char(1) PRIMARY KEY, FreeSpace int NULL,TotalSize int NULL) INSERT #drives(drive,FreeSpace) EXECmaster.dbo.xp_fixeddrives EXEC @hr=sp_OACreate'Scripting.FileSystemObject',@ fso OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo@fsoDECLARE dcur CURSOR LOCAL FAST_FORWARDFOR SELECT drive from #drives ORDER by driveOPEN dcur FETCH NEXT FROM dcur INTO @driveWHILE @@FETCH_STATUS=0BEGINEXEC @hr =sp_OAMethod @fso,'GetDrive', @odrive OUT, @driveIF @hr <> 0 EXEC sp_OAGetErrorInfo @fso EXEC @hr =sp_OAGetProperty@odrive,'TotalSize', @TotalSize OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo@odrive UPDATE #drives SET [email protected]/@MB [email protected] FETCH NEXT FROM dcur INTO @driveEndClose dcurDEALLOCATE dcurEXEC @hr=sp_OADestroy @fso IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso--SELECT @@Servername--SELECT--drive, TotalSize como 'Total(MB) ', FreeSpace como 'Free(MB)' FROM #drives--ORDER BY drive
CREATE TABLE #CPUInfo( Logical_CPU_Count bigint, Hyperthread_Ratio bigint, Physical_CPU_Count bigint, Physical_Memory_MB bigint)
INSERT INTO #CPUInfo( Logical_CPU_Count, Hyperthread_Ratio, Physical_CPU_Count, Physical_Memory_MB)SELECT cpu_count AS [Logical_CPU_Count] ,hyperthread_ratio AS [Hyperthread_Ratio] ,cpu_count/hyperthread_ratio AS [Physical_CPU_Count] , physical_memory_kb/1024 AS [Physical_Memory_MB]FROM sys.dm_os_sys_infoCREATE TABLE #DatabaseInfo( Machine_Name varchar(50), Instance_Name varchar(50), Sql_Server_Name varchar(50), Total_Database_log_size_MB bigint, Total_Database_log_used_MB bigint, Total_Database_Data_File_Size_MB bigint)INSERT INTO #DatabaseInfo( Machine_Name, _Instance_Name, Sql_Server_Nameus, Total_Database, Total_Database_Nameus, Total_Database, Total_Database_Data_File_Size_MB)select convert(varchar(50),serverproperty('MachineName')) 'Machine_Name' ,convert(varchar(50),isnull(serverproperty('InstanceName'),'mssqlserver')) 'Instance_Name' ,convert(varchar( 50),@@SERVERNAME) 'Sql_Server_Name' ,sum(ls.cntr_value/1024) como [Total_Database_log_size_MB] ,sum(lu.cntr_value/1024)as [Total_Database_log_used_MB] ,sum(ds.cntr_value/1024) como [Total_Database_Data_File_Size_MB]from sys.databases d junção externa esquerda sys.dm_os_performance_counters como lu em lu.instance_name=d.name e lu.counter_name como N'Log File(s) Use Size (KB)%' junção externa esquerda sys.dm_os_performance_counters como ls em ls. insta nce_name=d.name e ls.counter_name como N'Log File(s) Size (KB)%' e ls.cntr_value> 0 left outer join sys.dm_os_performance_counters como lp em lp.instance_name=d.name e lp.counter_name como N'Percent Log Used%' deixou a junção externa sys.dm_os_performance_counters como ds em ds.instance_name=d.name e ds.counter_name como N'Data File(s) Size (KB)%'where d.database_id>4; -- sistem database ler haricWITH SizeDisc AS( -- sunucu üzerindeki tüm drive size ve free size bilgisiSELECT SUM(TotalSize) as 'Total_Disc_Sizeon_Server_MB', SUM(FreeSpace) as 'Total_Free_Disc_SizeOn_Server_MB' FROM #drives)SELECT * FROM #DatabaseInfo,#CPUInfo, SizeDiscDROP TABLE #Drives DROP TABLE #DatabaseInfoDROP TABLE #CPUInfo GO/**************************************** *****************//* Desabilitando Procedimentos de Automação Ole */sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 0;GORECONFIGURE;/ **************************************************** *****/GO
A saída do script é a seguinte.
Continuarei a explicar a solução de problemas de desempenho do SQL Server no próximo artigo.
Solução de problemas de desempenho do SQL Server -5 Usando o SQL Server Profiler