Hej,
Jag kommer att fortsätta att förklara hur man felsöker prestandaproblem för SQL Server i den här artikelserien.
Felsökning av SQL-serverprestanda
Läs tidigare artikel innan detta.
Övervakning av prestandaräknare via PERFMON | Felsökning av SQL Server-prestanda -3
DMV ( Dynamic Management View )
Med DMV ( Dynamic Management Views ) och DMF ( Dynamic Management Functions) introducerade i SQL Server 2005 kan du övervaka alla aktiviteter som inträffat i databasen, prestandastatus och visa systeminformation för hantering och övervakning av databaser.
Alla databaser (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2, etc.) samlar in viss intern information (session, process etc. aktiviteter och deras statistik) om systemet och tillhandahåller dessa data som systemtabeller och vyer.
För att få information om operativsystemet och databasen är följande information allmänt tillgänglig i systemtabellerna som uppdateras regelbundet av SQL Server.
- Allmän information om databas och databasserver (namn, upplaga, version, teckenuppsättning etc.)
- Aktiva frågor
- CPU, I/O och minnesanvändning av Active Queries
- Utförandeplan
- Index som används av en pågående fråga
- I/O-vänta i minne, disk och nätverk
- Saknade index som negativt påverkar prestandan för databasen
- Användningshastigheter för index (Scan, Seek-värden)
- Svarstid för diskar
DMF ( Dynamic Management Function )
Även om DMV och DMF verkar vara likadana i SQL Server, kan skillnaden mellan dem direkt frågas som namnet på DMV, medan DMF är funktioner som tar en parameter och returnerar en tabell därefter.
Tack vare DMV och DMF kan du övervaka kritiska databaser som körs som produktion, identifiera problem omedelbart och vidta åtgärder därefter. Med dessa frågor kan du fråga de flesta CPU-, I/O- och Memory Consuming-satser från aktiva pågående frågor i databasen, hitta de saknade indextabellerna och hitta långsamma sökningar.
Alla DMV och DMF tillgängliga i SQL Server kan frågas med följande fråga.
välj namn,typ_desc från sys.system_objects där namn som 'dm%' sorteras efter namn;
Dessa DMV:er och DMF:er som används i SQL Server tillhandahåller information till användare enligt kategorier som Session, Databas, OS (operativsystem), Transaktion, etc. Till exempel; DMV och DMF i kategorin Databas börjar med sys.dm_db eller DMV och DMF relaterade till Transaktioner börjar med sys.dm_tran .
Listan över DMV och DMF efter kategorier är följande.
De vanligaste använda DMV och DMF är som följande.
Körning (SQL, Query, Process etc ): Aktivt körande frågors DMV och DMF som ger information som vilken användare som anropas från vilken maskin, processer, beräknade sluttider och frågestatistik.
De viktigaste är följande.
- 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)
Databas : Det är DMV och DMF som ger nödvändig information om Index, Mirroring och partitionering på databasnivå. De viktigaste är följande.
- 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)
Operativsystem: Det är DMV och DMF som ger nödvändig information om operativsystemet. De viktigaste är följande.
- 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)
välj topp 10 fall när sql_handle ÄR NULL sedan '' else ( substring(st.text,(qs.statement_start_offset+2)/2, (fall när qs.statement_end_offset =-1 sedan len(convert(nvarchar(MAX)) ,st.text))*2 else qs.statement_end_offset end - qs.statement_start_offset) /2 ) ) slut som query_text, qp.query_plan, (total_worker_time+0.0)/1000 as total_worker_time, (total_worker_time)/1+0.0. ) som [AvgCPUTime], total_logical_reads som [LogicalReads], total_logical_writes som [logicalWrites], execution_count, creation_time, last_execution_time, total_logical_reads+total_logical_writes as [AggIO], (total_logical_reads_writes as [AggIO], (total_logical_reads_writes as [AggIO]) st.dbid) som database_name, st.objectid som object_idfrån sys.dm_exec_query_stats qs korsa tillämpa sys.dm_exec_sql_text(sql_handle) st TILLÄMPNING KORSA sys.dm_exec_query_plan(qs.plan_handle) AS qp där total_worker_time> 0 order by total_worker_time desc;
När jag kör ovanstående fråga i AdventureWorks testdatabas som jag använde för mina tester, blir utdata enligt följande.
Jag kommer att dela skriptet ( Inkludera OS och Databas DMV och DMF ) som ger allmän information om operativsystemet som SQL Server-databasinstansen kör, som Total CPU, Memory, Total Disk Size, Database Size och Transaction Log Size.
Detta skript behövs särskilt när du förbereder dina databasinventeringar.
sp_configure 'visa avancerade alternativ', 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 Numerisk; SET @MB =1048576SKAPA TABELL #enheter (enhet char(1) PRIMÄRNYCKEL, FreeSpace int NULL,TotalSize int NULL) INSERT #enheter(enhet,FreeSpace) EXECmaster.dbo.xp_fixeddrives EXEC @hrate=Sp_Ojectb,Fix' fso OUT IF @hr <> 0 EXEC sp_OAGEtErrorInfo@fsoDECLARE dcur CURSOR LOCAL FAST_FORWARDFOR VÄLJ enhet från #drives BESTÄLLNING efter enhetÖPPNA dcur HÄMTA NÄSTA FRÅN dcur INTO @driveWHILE @@FETCH_STATUS @@FETCH_STATUS=0BEGINfsoEXEM,Ghrodet @fsoEXEM,Ghrodet @drive_Driva OUT, @driveIF @hr <> 0 EXEC sp_OAGEtErrorInfo @fso EXEC @hr =sp_OAGetProperty@odrive,'TotalSize', @TotalSize OUT IF @hr <> 0 EXEC sp_OAGEtErrorInfo@odrive UPPDATERING #drives SET exempel.com@qs [email protected] HÄMTA NÄSTA FRÅN dcur INTO @driveEndClose dcurDEALLOCATE dcurEXEC @hr=sp_OADestroy @fso IF @hr <> 0 EXEC sp_OAGEtErrorInfo @fso--SELECT @@Servername-SELECT--drive, TotalSize) ', FreeSpace som 'Free(MB)' FRÅN #drives--ORDER BY drive
SKAPA TABELL #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_infoCREATE 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_MBsvalue] ,sumt_0dlead_Data sys.databases d vänster yttre anslut sys.dm_os_performance_counters som lu på lu.instance_name=d.name och lu.counter_name som N'Log File(s) Used Size (KB)%' left outer join sys.dm_os_performance_counters som ls på ls. insta nce_name=d.name och ls.counter_name som N'Log File(s) Size (KB)%' och ls.cntr_value> 0 left outer join sys.dm_os_performance_counters som lp på lp.instance_name=d.name och lp.counter_name som N'Percent Log Used%' left outer join sys.dm_os_performance_counters som ds på ds.instance_name=d.name och ds.counter_name som N'Data File(s) Size (KB)%'where d.database_id>4; -- systemdatabas ler haricWITH SizeDisc AS( -- sunucu üzerindeki tüm enhetsstorlek och ledig storlek bilgisiSELECT SUM(TotalSize) som 'Total_Disc_Sizeon_Server_MB', SUM(FreeSpace) som 'Total_Free_Disc_Size_Disc_SizeOn'_Serm #Fo_SizeOn'_Serom #Fo,BasData_Serm #From,BasData_Serom #From,bas) SizeDiscDROP TABLE #Drives DROP TABLE #DatabasInfoDROP TABLE #CPUInfo GO/******************************************* ******************//* Inaktivera Ole Automation Procedures */sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 0;GORECONFIGURE;/ ************************************************** *****/GO
Utdata från skriptet är som följer.
Jag kommer att fortsätta att förklara SQL-serverns prestandafelsökning i nästa artikel.
SQL Server Performance Felsökning -5 Använda SQL Server Profiler