Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de DMV ( Dynamic Management View ) et DMF ( Dynamic Management Function ) | Dépannage des performances de SQL Server -4

Bonjour,

Je continuerai à expliquer comment résoudre les problèmes de performances de SQL Server dans cette série d'articles.

Dépannage des performances de SQL Server

Lisez l'article précédent avant celui-ci.

Surveillance des compteurs de performances via PERFMON | Dépannage des performances de SQL Server -3

DMV (vue de gestion dynamique)

Avec DMV ( Dynamic Management Views ) et DMF ( Dynamic Management Functions) introduits dans SQL Server 2005, vous pouvez surveiller toutes les activités survenues dans la base de données, l'état des performances et afficher les informations système pour la gestion et la surveillance des bases de données.

Toutes les bases de données (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2, etc.) collectent des informations internes (activités de session, de processus, etc. et leurs statistiques) sur le système et fournissent ces données sous forme de tables et de vues système.

Afin d'obtenir des informations sur le système d'exploitation et la base de données, les informations suivantes sont généralement disponibles dans les tables système mises à jour périodiquement par SQL Server.

  • Informations générales sur la base de données et le serveur de base de données (nom, édition, version, jeu de caractères, etc.)
  • Requêtes actives
  • Utilisation du processeur, des E/S et de la mémoire des requêtes actives
  • Plan d'exécution
  • Index utilisé par une requête en cours d'exécution
  • Attente d'E/S dans la mémoire, le disque et le réseau
  • Index manquants qui affectent négativement les performances de la base de données
  • Taux d'utilisation des index (Scan, Seek values)
  • Temps de réponse des disques

DMF (Fonction de gestion dynamique)

Bien que DMV et DMF semblent identiques dans SQL Server, la différence entre eux peut être directement interrogée en tant que nom de DMV, tandis que DMF sont des fonctions qui prennent un paramètre et renvoient une table en conséquence.

Grâce à DMV et aux DMF, vous pouvez surveiller les bases de données critiques exécutées en production, identifier immédiatement les problèmes et prendre des mesures en conséquence. Avec ces requêtes, vous pouvez interroger la plupart des instructions de consommation de CPU, d'E / S et de mémoire à partir de requêtes en cours d'exécution actives dans la base de données, rechercher les tables d'index manquantes et rechercher des requêtes lentes.

Tous les DMV et DMF disponibles dans SQL Server peuvent être interrogés avec la requête suivante.

select name,type_desc from sys.system_objects where name like 'dm%' trier par nom ;

Ces DMV et DMF utilisés dans SQL Server fournissent des informations aux utilisateurs selon des catégories telles que la session, la base de données, le système d'exploitation (système d'exploitation), la transaction, etc. Par exemple ; DMV et DMF dans la catégorie Base de données commencent par sys.dm_db ou DMV et DMF liés aux transactions commencent par sys.dm_tran .

La liste des DMV et DMF par catégories est la suivante.

Les DMV et DMF les plus couramment utilisés sont les suivants.

Exécution (SQL, requête, processus, etc.) :  DMV et DMF des requêtes en cours d'exécution actives qui fournissent des informations telles que l'utilisateur appelé à partir de quelle machine, les processus, les heures de fin estimées et les statistiques de requête.

Les plus importants sont les suivants.

  • 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)

Base de données : Ce sont DMV et DMF qui donnent les informations nécessaires sur l'index, la mise en miroir et le partitionnement au niveau de la base de données. Les plus importants sont les suivants.

  • 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)

Système d'exploitation : C'est DMV et DMF qui donne les informations nécessaires sur le système d'exploitation. Les plus importants sont les suivants.
  • 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)
Transaction : C'est DMV et DMF qui donnent les informations nécessaires sur Transaction. Les plus importants sont les suivants.
  • sys.dm_tran_active_transactions (DMV)
  • sys.dm_tran_session_transactions (DMV)
  • sys.dm_tran_database_transactions (DMV)
  • sys.dm_tran_current_transaction (DMV)
Allons utiliser DMV et DMF pour interroger les instructions TOP 10 CPU. Vous pouvez interroger le TOP 10 des déclarations CPU dans la base de données en utilisant DMV et DMF comme suit.

sélectionner les 10 premiers cas lorsque sql_handle EST NULL puis '' sinon ( substring(st.text,(qs.statement_start_offset+2)/2, ( cas lorsque qs.statement_end_offset =-1 then len(convert(nvarchar(MAX) ,st.text))*2 sinon qs.statement_end_offset end - qs.statement_start_offset) /2 ) ) end as query_text, qp.query_plan, (total_worker_time+0.0)/1000 as total_worker_time, (total_worker_time+0.0)/(execution_count*1000 ) comme [AvgCPUTime], total_logical_reads comme [LogicalReads], total_logical_writes comme [logicalWrites], execution_count, creation_time, last_execution_time, total_logical_reads+total_logical_writes comme [AggIO], (total_logical_reads+total_logical_writes)/(execution_count + 0.0) comme [AvgIO], db_name( st.dbid) comme database_name, st.objectid comme object_idfrom sys.dm_exec_query_stats qs croix appliquer sys.dm_exec_sql_text(sql_handle) st CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp où total_worker_time> 0 ordre par total_worker_time desc ;

Lorsque j'exécute la requête ci-dessus dans la base de données de test AdventureWorks que j'ai utilisée pour mes tests, la sortie sera la suivante.

Je vais partager le script ( Inclure le système d'exploitation et la base de données DMV et DMF) qui donne des informations générales sur le système d'exploitation exécuté par l'instance de base de données SQL Server, telles que le processeur total, la mémoire, la taille totale du disque, la taille de la base de données et la taille du journal des transactions.

Ce script est particulièrement nécessaire lors de la préparation de vos inventaires de bases de données.

sp_configure 'show advanced options', 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 Numeric ; 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 as 'Total(MB) ', FreeSpace as 'Free(MB)' FROM #drives--ORDER BY drive
CRÉER 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_CPU_Count] , physical_memory_kb/1024 AS [Physical_CPU_Count] pré> 
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_Name, Total_Database_log_size_MB, Total_Database_log_size_MB 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) as [Total_Database_log_size_MB] ,sum(lu.cntr_value/1024)as [Total_Database_log_used_MB] ,sum(ds.cntr_value/1024) as [Total_Database_Data_File_Size_MB]from sys.databases d jointure externe gauche sys.dm_os_performance_counters comme lu sur lu.nom_instance=d.name et lu.counter_name comme N'Taille utilisée du ou des fichiers journaux (Ko) %' jointure externe gauche sys.dm_os_performance_counters comme ls sur ls. Instagram nce_name=d.name et ls.counter_name comme N'Log File(s) Size (KB)%' and ls.cntr_value> 0 left external join sys.dm_os_performance_counters as lp on lp.instance_name=d.name and lp.counter_name like N'Percent Log Used%' jointure externe gauche sys.dm_os_performance_counters as ds on ds.instance_name=d.name and ds.counter_name like 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/**************************************** ******************//* Désactivation des procédures d'automatisation Ole */sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 0;GORECONFIGURE;/ ****************************************************** *****/ALLER

La sortie du script est la suivante.

Je continuerai à expliquer le dépannage des performances de SQL Server dans le prochain article.

Dépannage des performances de SQL Server -5 Utilisation de SQL Server Profiler