Hej,
Jeg vil fortsætte med at forklare, hvordan man fejlfinder ydelsesproblemer for SQL Server i denne artikelserie.
SQL Server Ydeevne Fejlfinding
Læs tidligere artikel før denne.
Overvågning af ydeevnetællere via PERFMON | SQL Server Performance Fejlfinding -3
DMV ( Dynamic Management View )
Med DMV ( Dynamic Management Views ) og DMF ( Dynamic Management Functions) introduceret i SQL Server 2005, kan du overvåge alle aktiviteter, der er foregået i databasen, ydeevnestatus og vise systemoplysninger til styring og overvågning af databaser.
Alle databaser (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2 osv.) indsamler nogle interne oplysninger (session, proces osv. aktiviteter og deres statistikker) om systemet og leverer disse data som systemtabeller og visninger.
For at få oplysninger om operativsystemet og databasen er følgende oplysninger generelt tilgængelige i systemtabellerne, som opdateres med jævne mellemrum af SQL Server.
- Generel information om database og databaseserver (navn, udgave, version, tegnsæt osv.)
- Aktive forespørgsler
- CPU, I/O og hukommelsesbrug af aktive forespørgsler
- Udførelsesplan
- Indeks brugt af en kørende forespørgsel
- I/O-vent i Hukommelse, Disk og Netværk
- Manglende indekser, der negativt påvirker databasens ydeevne
- Brugshastigheder for indekser (Scan, Seek-værdier)
- Diskes responstid
DMF ( Dynamic Management Function )
Selvom DMV og DMF ser ud som de samme i SQL Server, kan forskellen mellem dem søges direkte som navnet på DMV, hvorimod DMF er funktioner, der tager en parameter og returnerer en tabel i overensstemmelse hermed.
Takket være DMV og DMF'er kan du overvåge kritiske databaser, der kører som produktion, identificere problemer med det samme og handle i overensstemmelse hermed. Med disse forespørgsler kan du forespørge på de fleste CPU-, I/O- og Memory Consuming-udsagn fra aktive kørende forespørgsler i databasen, finde de manglende indekstabeller og finde langsomt kørende forespørgsler.
Alle DMV og DMF tilgængelige i SQL Server kan forespørges med følgende forespørgsel.
vælg navn,type_desc fra sys.system_objects, hvor navn som 'dm%' sorteres efter navn;
Disse DMV'er og DMF'er, der bruges i SQL Server, giver oplysninger til brugere i henhold til kategorier som Session, Database, OS (operativsystem), Transaktion osv. For eksempel; DMV og DMF i kategorien Database starter med sys.dm_db eller DMV og DMF relateret til Transaktioner starter med sys.dm_tran .
Listen over DMV og DMF efter kategorier er som følger.
Mest almindeligt brugte DMV og DMF er som følgende.
Udførelse (SQL, Forespørgsel, Proces osv.): Aktive kørende forespørgslers DMV og DMF, som giver information såsom hvilken bruger der kaldes fra hvilken maskine, processer, estimerede sluttider og forespørgselsstatistik.
De vigtigste er som følger.
- 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)
Database: Det er DMV og DMF, som giver nødvendig information om indeks, spejling og partitionering på databaseniveau. De vigtigste er som følger.
- 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 er DMV og DMF, der giver den nødvendige information om operativsystemet. De vigtigste er som følger.
- 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ælg top 10 tilfælde, når sql_handle ER NULL derefter '' else ( substring(st.text,(qs.statement_start_offset+2)/2, (case, når qs.statement_end_offset =-1 derefter 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)/execution_time)/100. ) 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_+rites as [AggIO], (total_logical_reads_writes as st.dbid) som databasenavn, st.objektid som objekt-id fra sys.dm_exec_query_stats qs krydsanvend sys.dm_exec_sql_text(sql_handle) st KRYDSANVEND sys.dm_exec_query_plan(qs.plan_handle) AS qp hvor total_worker_time> 0 ordre efter total_worker_time desc;
Når jeg kører ovenstående forespørgsel i AdventureWorks testdatabase, som jeg brugte til mine tests, vil output være som følger.
Jeg deler scriptet (Inkluder OS og Database DMV og DMF), der giver generelle oplysninger om det operativsystem, som SQL Server-databaseinstansen kører, såsom Total CPU, Hukommelse, Total Disk Size, Database Size og Transaction Log Size.
Dette script er især nødvendigt, når du forbereder dine databasebeholdninger.
sp_configure 'vis avancerede indstillinger', 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 =1048576OPRET TABEL #drev (drev char(1) PRIMÆR NØGLE, FreeSpace int NULL,TotalSize int NULL) INDSÆT #drev(drev,FreeSpace) EXECmaster.dbo.xp_fixeddrives EXEC @[email protected]'ScriptOAC. fso OUT IF @hr <> 0 EXEC sp_OAGEtErrorInfo@fsoDECLARE dcur CURSOR LOCAL FAST_FORWARDFOR VÆLG drev fra #drev BESTILLE efter drevÅBN dcur FETCH NEXT FRA dcur INTO @driveWHILE @@FETCH_STATUS @ethrode spp_EXEM,GHRode @ethrode sp_EXEM,'Grode =0BEGINfsoEXEM,'GOD OUT, @driveIF @hr <> 0 EXEC sp_OAGEtErrorInfo @fso EXEC @hr =sp_OAGetProperty@odrive,'TotalSize', @TotalSize OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo@odrive OPDATERING @MBldat SET eksempel.com@qs [email protected] FETCH NÆSTE FRA dcur INTO @driveEndClose dcurDEALLOCATE dcurEXEC @hr=sp_OADestroy @fso IF @hr <> 0 EXEC sp_OAGEtErrorInfo @fso--SELECT @@Servername-SELECT--driveTotal, TotalSize) ', FreeSpace som 'Free(MB)' FRA #drives--ORDER BY drive
OPRET TABEL #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) som [Total_Database_log_size_MB] ,sum(lu.cntr_value/1024)as [Total_Database_log_used_MBsvalu.c_total_02Database] ,sumt_02Database sys.databases d venstre ydre joinforbindelse sys.dm_os_performance_counters som lu på lu.instance_name=d.name og 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 og ls.counter_name som N'Log File(s) Size (KB)%' og ls.cntr_value> 0 left outer join sys.dm_os_performance_counters som lp på lp.instance_name=d.name og lp.counter_name like N'Percent Log Used%' venstre ydre join sys.dm_os_performance_counters som ds på ds.instance_name=d.name og ds.counter_name som N'Data File(s) Size (KB)%'where d.database_id>4; -- systemdatabase ler haricWITH SizeDisc AS( -- sunucu üzerindeki tüm drevstørrelse og fri størrelse bilgisiSELECT SUM(TotalSize) som 'Total_Disc_Sizeon_Server_MB', SUM(FreeSpace) som 'Total_Free_Disc_Size_Disc_SizeOn_Serm #Fo_SizeOn_Serom #FoSerMb_Serm #FoSermBas_Server #FoRmBaS_Server #FoRmBas_Server SizeDiscDROP TABEL #Drives DROP TABEL #DatabaseInfoDROP TABEL #CPUInfo GO/******************************************* ******************//* Deaktivering af Ole Automation Procedures */sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 0;GORECONFIGURE;/ ************************************************** *****/GO
Outputtet af scriptet er som følger.
Jeg vil fortsætte med at forklare SQL Server Performance Fejlfinding i den næste artikel.
SQL Server Performance Fejlfinding -5 Brug af SQL Server Profiler