Hallo,
Ik zal in deze serie artikelen blijven uitleggen hoe u prestatieproblemen van SQL Server kunt oplossen.
SQL Server Performance Problemen oplossen
Lees hiervoor het vorige artikel.
Prestatiemeteritems bewaken via PERFMON | Problemen met SQL Server-prestaties oplossen -3
DMV (Dynamische beheerweergave)
Met DMV ( Dynamic Management Views ) en DMF ( Dynamic Management Functions ) geïntroduceerd in SQL Server 2005, kunt u alle activiteiten in de database volgen, de prestatiestatus en systeeminformatie weergeven voor het beheren en bewaken van databases.
Alle databases (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2, etc.) verzamelen interne informatie (sessies, processen etc. activiteiten en hun statistieken) over het systeem en leveren deze gegevens als systeemtabellen en -weergaven.
Om informatie over het besturingssysteem en de database te verkrijgen, is de volgende informatie over het algemeen beschikbaar in de systeemtabellen die periodiek worden bijgewerkt door SQL Server.
- Algemene informatie over database en databaseserver (naam, editie, versie, tekenset enz.)
- Actieve zoekopdrachten
- CPU, I/O en geheugengebruik van actieve zoekopdrachten
- Uitvoeringsplan
- Index gebruikt door een lopende zoekopdracht
- I/O wacht in geheugen, schijf en netwerk
- Ontbrekende indexen die de prestaties van de database negatief beïnvloeden
- Gebruikspercentages van indexen (Scan-, Seek-waarden)
- Responstijd van schijven
DMF ( Dynamische beheerfunctie)
Hoewel DMV en DMF hetzelfde lijken in SQL Server, kan het verschil tussen beide direct worden opgevraagd als de naam van DMV, terwijl DMF functies zijn die een parameter nemen en dienovereenkomstig een tabel retourneren.
Dankzij DMV en DMF's kunt u kritieke databases die als productie draaien in de gaten houden, problemen onmiddellijk identificeren en dienovereenkomstig actie ondernemen. Met deze query's kunt u de meeste CPU-, I/O- en geheugenverbruikende instructies van actief lopende query's in de database opvragen, de ontbrekende indextabellen vinden en langzaam lopende query's vinden.
Alle DMV en DMF die beschikbaar zijn in SQL Server kunnen worden opgevraagd met de volgende query.
select name,type_desc van sys.system_objects waar naam zoals 'dm%' op naam ordenen;
Deze DMV's en DMF's die in SQL Server worden gebruikt, verstrekken informatie aan gebruikers op basis van categorieën zoals Sessie, Database, OS (besturingssysteem), Transactie, enz. Bijvoorbeeld; DMV en DMF in de categorie Database beginnen met sys.dm_db of DMV en DMF gerelateerd aan Transacties beginnen met sys.dm_tran .
De lijst met DMV en DMF per categorie is als volgt.
De meest gebruikte DMV en DMF zijn als volgt.
Uitvoering (SQL, Query, Proces enz.): DMV en DMF van actieve lopende query's die informatie verstrekken zoals welke gebruiker vanaf welke machine wordt gebeld, processen, geschatte eindtijden en querystatistieken.
De belangrijkste zijn als volgt.
- 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 : Het zijn DMV en DMF die de nodige informatie geven over Index, Mirroring en partitionering op databaseniveau. De belangrijkste zijn als volgt.
- 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)
Besturingssysteem: Het zijn DMV en DMF die de nodige informatie over het besturingssysteem geven. De belangrijkste zijn als volgt.
- 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)
selecteer top 10 geval wanneer sql_handle IS NULL dan '' else ( substring(st.text,(qs.statement_start_offset+2)/2, ( geval wanneer qs.statement_end_offset =-1 dan len(convert(nvarchar(MAX) ,st.text))*2 else qs.statement_end_offset end - qs.statement_start_offset) /2 ) ) eindigen als query_text, qp.query_plan, (total_worker_time+0.0)/1000 als total_worker_time, (total_worker_time+0.0)/(execution_count*1000 ) als [AvgCPUTime], total_logical_reads als [LogicalReads], total_logical_writes als [logicalWrites], execution_count, creation_time, last_execution_time, total_logical_reads+total_logical_writes as [AggIO], (total_logical_reads+total_logical_executions_) +(total_logical_reads+total_logical_executions_) +( st.dbid) als database_name, st.objectid als object_id van sys.dm_exec_query_stats qs kruis toepassen sys.dm_exec_sql_text(sql_handle) st KRUIS TOEPASSEN sys.dm_exec_query_plan(qs.plan_handle) AS qp waarbij total_worker_time> 0 bestelling op total_worker_time desc;
Als ik de bovenstaande query uitvoer in de AdventureWorks-testdatabase die ik voor mijn tests heb gebruikt, is de uitvoer als volgt.
Ik zal het script delen (inclusief OS en database DMV en DMF) dat algemene informatie geeft over het besturingssysteem waarop de SQL Server-database-instantie wordt uitgevoerd, zoals totale CPU, geheugen, totale schijfgrootte, databasegrootte en transactielogboekgrootte.
Dit script is vooral nodig bij het voorbereiden van uw database-inventarissen.
sp_configure 'toon geavanceerde opties', 1;GORECONFIGURE;GOsp_configure 'Ole-automatiseringsprocedures', 1;GORECONFIGURE;GO/************************* *******************************/SET NOCOUNT ONDECLARE @hr intDECLARE @fso intDECLARE @drive char(1)DECLARE @ odrive intDECLARE @TotalSize varchar(20) DECLARE @MB Numeriek; 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 LOKAAL FAST_FORWARDFOR SELECTEER drive van #drives ORDER per driveOPEN dcur FETCH NEXT FROM dcur INTO @driveWHILE @@FETCH_STATUS=hr =spEGINOAC @@FETCH_STATUS=0BEGINOAC 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]/@ [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 ' ', FreeSpace als 'Free(MB)' VAN #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] ASC [ pre>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_Total_Database] sys.databases d left outer join sys.dm_os_performance_counters als lu op lu.instance_name=d.name en lu.counter_name zoals N'Log File(s) Gebruikte grootte (KB)%' left outer join sys.dm_os_performance_counters als ls op ls. insta nce_name=d.name en ls.counter_name like N'Log File(s) Size (KB)%' and ls.cntr_value> 0 left outer join sys.dm_os_performance_counters als lp op lp.instance_name=d.name en lp.counter_name like N'Percent Log Used%' linker buitenste join sys.dm_os_performance_counters als ds op ds.instance_name=d.name en ds.counter_name zoals N'Data File(s) Size (KB)%'where d.database_id>4; -- systeemdatabase 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 #Info SizeDiscDROP TABLE #Drives DROP TABLE #DatabaseInfoDROP TABLE #CPUInfo GO/**************************************** ****************//* Ole-automatiseringsprocedures uitschakelen */sp_configure 'toon geavanceerde opties', 1;GORECONFIGURE;GOsp_configure 'Ole-automatiseringsprocedures', 0;GORECONFIGURE;/ ************************************************** *****/GO
De uitvoer van het script is als volgt.
In het volgende artikel zal ik het oplossen van problemen met de prestaties van SQL Server blijven uitleggen.
Problemen met SQL Server-prestaties oplossen -5 SQL Server Profiler gebruiken