Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando DMV (Exibição de gerenciamento dinâmico) e DMF (Função de gerenciamento dinâmico) | Solução de problemas de desempenho do SQL Server -4


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)
Transação: É o DMV e o DMF que fornecem as informações necessárias sobre a Transação. Os mais importantes são os seguintes.
  • sys.dm_tran_active_transactions (DMV)
  • sys.dm_tran_session_transactions (DMV)
  • sys.dm_tran_database_transactions (DMV)
  • sys.dm_tran_current_transaction (DMV)
Vamos usar DMV e DMF para consultar as 10 principais declarações de CPU. Você pode consultar as 10 principais declarações de CPU no banco de dados usando DMV e DMF como a seguir.

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_info 
CREATE 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