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)
- sys.dm_tran_active_transactions (DMV)
- sys.dm_tran_session_transactions (DMV)
- sys.dm_tran_database_transactions (DMV)
- sys.dm_tran_current_transaction (DMV)
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