Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von DMV ( Dynamic Management View ) und DMF ( Dynamic Management Function ) | Fehlerbehebung bei der SQL Server-Leistung -4

Hallo,

Ich werde in dieser Artikelserie weiterhin erläutern, wie Leistungsprobleme von SQL Server behoben werden können.

Fehlerbehebung bei der SQL Server-Leistung

Lesen Sie zuvor den vorherigen Artikel.

Überwachen von Leistungsindikatoren über PERFMON | Fehlerbehebung bei der SQL Server-Leistung -3

DMV (dynamische Verwaltungsansicht)

Mit den in SQL Server 2005 eingeführten DMV (Dynamic Management Views) und DMF (Dynamic Management Functions) können Sie alle Aktivitäten in der Datenbank und den Leistungsstatus überwachen und Systeminformationen zum Verwalten und Überwachen von Datenbanken anzeigen.

Alle Datenbanken (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2 usw.) sammeln einige interne Informationen (Sitzungs-, Prozess- usw. Aktivitäten und ihre Statistiken) über das System und stellen diese Daten als Systemtabellen und -ansichten bereit.

Um Informationen über das Betriebssystem und die Datenbank zu erhalten, sind die folgenden Informationen allgemein in den Systemtabellen verfügbar, die regelmäßig von SQL Server aktualisiert werden.

  • Allgemeine Informationen zu Datenbank und Datenbankserver (Name, Edition, Version, Zeichensatz etc.)
  • Aktive Suchanfragen
  • CPU-, I/O- und Speichernutzung von Active Queries
  • Ausführungsplan
  • Von einer laufenden Abfrage verwendeter Index
  • E/A-Wartezeiten in Speicher, Festplatte und Netzwerk
  • Fehlende Indizes, die die Leistung der Datenbank beeinträchtigen
  • Nutzungsraten von Indizes (Scan, Seek-Werte)
  • Antwortzeit der Festplatten

DMF (Dynamische Verwaltungsfunktion)

Obwohl DMV und DMF in SQL Server gleich erscheinen, kann der Unterschied zwischen ihnen direkt als Name von DMV abgefragt werden, während DMF Funktionen sind, die einen Parameter annehmen und entsprechend eine Tabelle zurückgeben.

Dank DMV und DMFs können Sie kritische Datenbanken überwachen, die als Produktion laufen, Probleme sofort erkennen und entsprechende Maßnahmen ergreifen. Mit diesen Abfragen können Sie die meisten CPU-, E/A- und speicherverbrauchenden Anweisungen von aktiv laufenden Abfragen in der Datenbank abfragen, die fehlenden Indextabellen finden und langsam laufende Abfragen finden.

Alle in SQL Server verfügbaren DMV und DMF können mit der folgenden Abfrage abgefragt werden.

select name,type_desc from sys.system_objects wo name like 'dm%' order by name;

Diese in SQL Server verwendeten DMVs und DMFs stellen Benutzern Informationen nach Kategorien wie Sitzung, Datenbank, OS (Betriebssystem), Transaktion usw. zur Verfügung. Zum Beispiel; DMV und DMF in der Datenbankkategorie beginnen mit sys.dm_db oder DMV und DMF in Bezug auf Transaktionen beginnen mit sys.dm_tran .

Die Liste der DMV und DMF nach Kategorien ist wie folgt.

Die am häufigsten verwendeten DMV und DMF sind wie folgt.

Ausführung (SQL, Abfrage, Prozess usw.):  DMV und DMF aktiver laufender Abfragen, die Informationen liefern, wie z. B. welcher Benutzer von welchem ​​Computer aufgerufen wird, Prozesse, geschätzte Endzeiten und Abfragestatistiken.

Die wichtigsten sind wie folgt.

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

Datenbank : Es sind DMV und DMF, die die notwendigen Informationen über Indizierung, Spiegelung und Partitionierung auf Datenbankebene liefern. Die wichtigsten sind wie folgt.

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

Betriebssystem: Es sind DMV und DMF, die die notwendigen Informationen über das Betriebssystem liefern. Die wichtigsten sind wie folgt.
  • 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)
Transaktion: Es sind DMV und DMF, die die notwendigen Informationen über die Transaktion liefern. Die wichtigsten sind wie folgt.
  • sys.dm_tran_active_transactions (DMV)
  • sys.dm_tran_session_transactions (DMV)
  • sys.dm_tran_database_transactions (DMV)
  • sys.dm_tran_current_transaction (DMV)
Lassen Sie uns DMV und DMF verwenden, um die TOP 10 CPU-Anweisungen abzufragen. Sie können die TOP 10 CPU-Anweisungen in der Datenbank mit DMV und DMF wie folgt abfragen.

Top-10-Fall auswählen, wenn sql_handle NULL ist, dann '' 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 ) ) 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 ) als [AvgCPUTime], total_logical_reads als [LogicalReads], total_logical_writes als [logicalWrites], execute_count, creation_time, last_execution_time, total_logical_reads+total_logical_writes als [AggIO], (total_logical_reads+total_logical_writes)/(execution_count + 0.0) as [AvgIO], db_name( st.dbid) als Datenbankname, st.objectid als Objekt-ID aus sys.dm_exec_query_stats qs Kreuzweise sys.dm_exec_sql_text(sql_handle) st anwenden CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp where total_worker_time> 0 order by total_worker_time desc;

Wenn ich die obige Abfrage in der AdventureWorks-Testdatenbank ausführe, die ich für meine Tests verwendet habe, sieht die Ausgabe wie folgt aus.

Ich werde das Skript teilen ( OS and Database DMV and DMF einschließen ), das allgemeine Informationen über das Betriebssystem enthält, auf dem die SQL Server-Datenbankinstanz ausgeführt wird, z. B. Gesamt-CPU, Arbeitsspeicher, Gesamtdatenträgergröße, Datenbankgröße und Transaktionsprotokollgröße.

Dieses Skript wird besonders benötigt, wenn Sie Ihre Datenbankinventuren vorbereiten.

sp_configure 'Erweiterte Optionen anzeigen', 1;GORECONFIGURE;GOsp_configure 'Ole-Automatisierungsprozeduren', 1;GORECONFIGURE;GO/*********************** ********************************/SET NOCOUNT ONDECLARE @hr intDECLARE @fso intDECLARE @drive char(1)DECLARE @ odrive intDECLARE @TotalSize varchar(20) DECLARE @MB Numerisch; 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 als '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_sys_info]FROM sys_info vor> 
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,MB_used_data_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 Left Outer Join sys.dm_os_performance_counters as lu on lu.instance_name=d.name and lu.counter_name like N'Log File(s) Used Size (KB)%' left outer join sys.dm_os_performance_counters as ls on ls. sofort nce_name=d.name und ls.counter_name wie N'Log File(s) Size (KB)%' und ls.cntr_value> 0 left outer join sys.dm_os_performance_counters as lp on lp.instance_name=d.name and lp.counter_name like N'Percent Log Used%' left outer join 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/**************************************** ******************//* Ole-Automatisierungsprozeduren deaktivieren */sp_configure 'Erweiterte Optionen anzeigen', 1;GORECONFIGURE;GOsp_configure 'Ole-Automatisierungsprozeduren', 0;GORECONFIGURE;/ ****************************************************** *****/GO

Die Ausgabe des Skripts sieht wie folgt aus.

Im nächsten Artikel werde ich die Fehlerbeseitigung bei der SQL Server-Leistung weiter erläutern.

Fehlerbehebung bei der SQL Server-Leistung -5 Verwendung des SQL Server Profiler