Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzo di DMV (Dynamic Management View) e DMF (Dynamic Management Function) | Risoluzione dei problemi relativi alle prestazioni di SQL Server -4

Ciao,

Continuerò a spiegare come risolvere i problemi di prestazioni di SQL Server in questa serie di articoli.

Risoluzione dei problemi relativi alle prestazioni di SQL Server

Leggi l'articolo precedente prima di questo.

Monitoraggio dei contatori delle prestazioni tramite PERFMON | Risoluzione dei problemi relativi alle prestazioni di SQL Server -3

DMV (Vista a gestione dinamica)

Con DMV (Dynamic Management Views) e DMF (Dynamic Management Functions) introdotti in SQL Server 2005, puoi monitorare tutte le attività avvenute nel database, lo stato delle prestazioni e visualizzare le informazioni di sistema per la gestione e il monitoraggio dei database.

Tutti i database (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2, ecc.) raccolgono alcune informazioni interne (attività di Sessione, Processo ecc. e relative statistiche) sul sistema e forniscono questi dati come tabelle di sistema e viste.

Per ottenere informazioni sul Sistema Operativo e sul Database, sono generalmente disponibili le seguenti informazioni nelle Tabelle di Sistema che vengono aggiornate periodicamente da SQL Server.

  • Informazioni generali sul database e sul server di database (nome, edizione, versione, set di caratteri, ecc.)
  • Query attive
  • Utilizzo CPU, I/O e memoria delle query attive
  • Piano di esecuzione
  • Indice utilizzato da una query in esecuzione
  • I/O in attesa in memoria, disco e rete
  • Indici mancanti che influiscono negativamente sulle prestazioni del Database
  • Tassi di utilizzo degli indici (Scansione, Ricerca valori)
  • Tempo di risposta dei dischi

DMF (Funzione di gestione dinamica)

Sebbene DMV e DMF sembrino uguali in SQL Server, la differenza tra loro può essere richiesta direttamente come nome di DMV, mentre DMF sono funzioni che accettano un parametro e restituiscono una tabella di conseguenza.

Grazie a DMV e DMF, puoi monitorare i database critici in esecuzione come Produzione, identificare immediatamente i problemi e agire di conseguenza. Con queste query, puoi eseguire query sulla maggior parte delle istruzioni CPU, I/O e consumo di memoria da query in esecuzione attive nel database, trovare le tabelle degli indici mancanti e trovare query a esecuzione lenta.

Tutti i DMV e DMF disponibili in SQL Server possono essere interrogati con la query seguente.

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

Questi DMV e DMF utilizzati in SQL Server forniscono informazioni agli utenti in base a Categorie come Sessione, Database, Sistema operativo (sistema operativo), Transazione, ecc. Ad esempio; DMV e DMF nella categoria Database iniziano con sys.dm_db oppure DMV e DMF relativi alle Transazioni iniziano con sys.dm_tran .

L'elenco di DMV e DMF per categorie è il seguente.

I più comuni DMV e DMF utilizzati sono i seguenti.

Esecuzione (SQL, Query, Processo ecc.):  DMV e DMF di query attive in esecuzione che forniscono informazioni come l'utente chiamato da quale macchina, processi, tempi di fine stimati e statistiche delle query.

I più importanti sono i seguenti.

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

Banca dati : Sono DMV e DMF che forniscono le informazioni necessarie su Index, Mirroring e partizionamento a livello di database. I più importanti sono i seguenti.

  • 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 operativo: Sono DMV e DMF che forniscono le informazioni necessarie sul sistema operativo. I più importanti sono i seguenti.
  • 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)
Transazione: Sono DMV e DMF a fornire le informazioni necessarie sulla transazione. I più importanti sono i seguenti.
  • sys.dm_tran_active_transactions (DMV)
  • sys.dm_tran_session_transactions (DMV)
  • sys.dm_tran_database_transactions (DMV)
  • sys.dm_tran_current_transaction (DMV)
Andiamo a usare DMV e DMF per interrogare le TOP 10 istruzioni della CPU. È possibile interrogare le TOP 10 istruzioni CPU nel database utilizzando DMV e DMF come segue.

select top 10
 case when sql_handle IS NULL
 then '' 
 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) as [AvgCPUTime]
, total_logical_reads as [LogicalReads]
, total_logical_writes as [logicalWrites]
, execution_count
, creation_time
, last_execution_time
, total_logical_reads+total_logical_writes as [AggIO]
, (total_logical_reads+total_logical_writes)/(execution_count + 0.0) as [AvgIO]
, db_name(st.dbid) as database_name
, st.objectid as object_id
from 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
where total_worker_time > 0 
order by total_worker_time desc;

Quando eseguo la query precedente nel database di test AdventureWorks che ho usato per i miei test, l'output sarà il seguente.

Condividerò lo script (Includi OS e Database DMV e DMF) che fornisce informazioni generali sul sistema operativo in cui è in esecuzione l'istanza del database di SQL Server, come CPU totale, memoria, dimensione totale del disco, dimensione del database e dimensione del registro delle transazioni.

Questo script è particolarmente necessario durante la preparazione degli inventari del database.

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
/*******************************************************/
SET NOCOUNT ON
DECLARE @hr int
DECLARE @fso int
DECLARE @drive char(1)
DECLARE @odrive int
DECLARE @TotalSize varchar(20) DECLARE @MB Numeric ; SET @MB = 1048576
CREATE TABLE #drives (drive char(1) PRIMARY KEY, FreeSpace int NULL,
TotalSize int NULL) INSERT #drives(drive,FreeSpace) EXEC
master.dbo.xp_fixeddrives EXEC @hr=sp_OACreate
'Scripting.FileSystemObject',@fso OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo
@fso
DECLARE dcur CURSOR LOCAL FAST_FORWARD
FOR SELECT drive from #drives ORDER by drive
OPEN dcur FETCH NEXT FROM dcur INTO @drive
WHILE @@FETCH_STATUS=0
BEGIN
EXEC @hr = sp_OAMethod @fso,'GetDrive', @odrive OUT, @drive
IF @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 WHERE
[email protected] FETCH NEXT FROM dcur INTO @drive
End
Close dcur
DEALLOCATE dcur
EXEC @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
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_Name,
 Total_Database_log_size_MB,
 Total_Database_log_used_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.instance_name=d.name and ls.counter_name like N'Log File(s) Size (KB)%' and 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 haric
WITH SizeDisc AS
( -- sunucu üzerindeki tüm drive size ve free size bilgisi
SELECT SUM(TotalSize) as 'Total_Disc_Sizeon_Server_MB', 
SUM(FreeSpace) as 'Total_Free_Disc_SizeOn_Server_MB' 
FROM #drives
)
SELECT * FROM #DatabaseInfo,#CPUInfo,SizeDisc
DROP TABLE #Drives 
DROP TABLE #DatabaseInfo
DROP TABLE #CPUInfo 
GO
/*******************************************************/
/* Disabling Ole Automation Procedures */
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 0;
GO
RECONFIGURE;
/*******************************************************/
GO

L'output dello script è il seguente.

Continuerò a spiegare Risoluzione dei problemi relativi alle prestazioni di SQL Server nel prossimo articolo.

Risoluzione dei problemi relativi alle prestazioni di SQL Server -5 Utilizzo di SQL Server Profiler