Ahoj,
V této sérii článků budu nadále vysvětlovat, jak řešit problémy s výkonem serveru SQL.
Odstraňování problémů s výkonem serveru SQL Server
Před tímto si přečtěte předchozí článek.
Monitorování počítadel výkonu prostřednictvím PERFMON | Řešení problémů s výkonem serveru SQL -3
DMV ( Dynamic Management View )
S funkcemi DMV (Dynamic Management Views) a DMF (Dynamic Management Functions) představenými v SQL Server 2005 můžete monitorovat všechny aktivity v databázi, stav výkonu a zobrazovat systémové informace pro správu a monitorování databází.
Všechny databáze (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2 atd.) shromažďují některé interní informace (aktivity relace, procesu atd. a jejich statistiky) o systému a poskytují tato data jako systémové tabulky a pohledy.
Pro získání informací o OS a Databázi jsou obecně dostupné následující informace v Systémových tabulkách, které jsou pravidelně aktualizovány SQL Serverem.
- Obecné informace o databázi a databázovém serveru (název, vydání, verze, znaková sada atd.)
- Aktivní dotazy
- Využití aktivních dotazů CPU, I/O a paměti
- Prováděcí plán
- Index používaný spuštěným dotazem
- I/O čekání v paměti, disku a síti
- Chybějící indexy, které nepříznivě ovlivňují výkon databáze
- Míra využití indexů (hodnoty Scan, Seek)
- Doba odezvy disků
DMF ( Dynamic Management Function )
Přestože se DMV a DMF na SQL Serveru zdají být stejné, rozdíl mezi nimi lze přímo zjistit jako název DMV, zatímco DMF jsou funkce, které přebírají parametr a podle toho vracejí tabulku.
Díky DMV a DMF můžete monitorovat kritické databáze běžící jako produkční, okamžitě identifikovat problémy a podle toho jednat. Pomocí těchto dotazů můžete dotazovat většinu příkazů CPU, I/O a Memory Consuming z aktivních běžících dotazů v databázi, najít chybějící indexové tabulky a najít pomalu běžící dotazy.
Všechny DMV a DMF dostupné v SQL Server lze dotazovat pomocí následujícího dotazu.
vyberte name,type_desc ze sys.system_objects, kde název jako 'dm%' seřaďte podle názvu;
Tyto DMV a DMF používané v SQL Serveru poskytují informace uživatelům podle kategorií, jako je relace, databáze, OS (operační systém), transakce atd. Například; DMV a DMF v kategorii Databáze začínají sys.dm_db nebo DMV a DMF související s transakcemi začínají sys.dm_tran .
Seznam DMV a DMF podle kategorií je následující.
Nejčastěji používané DMV a DMF jsou následující.
Provedení (SQL, dotaz, proces atd.): DMV a DMF aktivních spuštěných dotazů, které poskytují informace, jako například který uživatel je volán z kterého počítače, procesy, odhadované časy ukončení a statistiky dotazů.
Nejdůležitější z nich jsou následující.
- 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)
Databáze: Jsou to DMV a DMF, které poskytují potřebné informace o indexu, zrcadlení a dělení na úrovni databáze. Nejdůležitější z nich jsou následující.
- 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)
Operační systém: Právě DMV a DMF poskytují potřebné informace o operačním systému. Nejdůležitější jsou následující.
- 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)
vyberte 10 prvních případů, když sql_handle JE NULL, pak '' else ( substring(st.text,(qs.statement_start_offset+2)/2, (případ, když 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 cution)*1 exe ) jako [AvgCPUTime], total_logical_reads jako [LogicalReads], total_logical_writes as [logicalWrites], running_count, creation_time, last_execution_time, total_logical_reads+total_logical_writes as [AggIO], (celkový_název_logických_čtení+celkový_počet_logických_zápisů_0.0.exe) + db st.dbid) jako název_databáze, st.objectid jako ID_objektu z sys.dm_exec_query_stats qs křížové použití sys.dm_exec_sql_text(sql_handle) st KŘÍŽOVÁ POUŽIŤ sys.dm_exec_query_plan(qs.plan_handle) JAKO qp kde total_worker_time> 0 pořadí podle total_worker_time desc;
Když spustím výše uvedený dotaz v testovací databázi AdventureWorks, kterou jsem použil pro své testy, výstup bude následující.
Budu sdílet skript (zahrnout OS a databáze DMV a DMF), který poskytuje obecné informace o operačním systému, na kterém je spuštěna instance databáze SQL Server, jako je celkový procesor, paměť, celková velikost disku, velikost databáze a velikost protokolu transakcí.
Tento skript je zvláště potřebný při přípravě inventářů databáze.
sp_configure 'show advanced options', 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 Numeric; SET @MB =1048576CREATE TABLE #drives (drive char(1) PRIMÁRNÍ KLÍČ, FreeSpace int NULL,TotalSize int NULL) INSERT #drives(drives,FreeSpace) EXECmaster.dbo.xp_fixeddrives EXject'@hr=sping_OACleate' fso OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo@fsoDECLARE dcur CURSOR LOCAL FAST_FORWARDFOR SELECT drive from #drives ORDER by driveOPEN dcur FETCH NEXT FROM dcur INTO @driveWHILE @@FETCH_STATUS'=spet_DrivefsoCAM, @driveWHILE =spetGethod'EXECAM, @driveWHILE OUT, @driveIF @hr <> 0 EXEC sp_OAGetErrorInfo @fso EXEC @hr =sp_OAGetProperty@odrive,'TotalSize', @TotalSize OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo@odrive AKTUALIZACE #drives SET example@sql [email protected] NAČÍST DALŠÍ Z dcur DO @driveEndClose dcurDEALLOCATE dcurEXEC @hr=sp_OADestroy @fso IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso--SELECT @@MBServername--SELECTize astal', Total', Total ', FreeSpace jako 'Free(MB)' FROM #drives--ORDER BY drive
VYTVOŘIT TABULKU #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(Name')) 'Instance,conchar 50),@@SERVERNAME) 'Sql_Server_Name' ,sum(ls.cntr_value/1024) jako [Total_Database_log_size_MB] ,sum(lu.cntr_value/1024)jako [Sql_Database_log_used_MB_24.cata)Database/Data)1MB sys.databases d levé vnější spojení sys.dm_os_performance_counters jako lu na lu.instance_name=d.name a lu.counter_name jako N'Log File(s) Použitá velikost (KB)%' levé vnější spojení sys.dm_os_performance_counters jako ls na ls. insta nce_name=d.name a ls.counter_name jako N'Log File(s) Size (KB)%' a ls.cntr_value> 0 levé vnější spojení sys.dm_os_performance_counters jako lp na lp.instance_name=d.name a lp.counter_name jako N'Percent Log Used%' levé vnější spojení sys.dm_os_performance_counters jako ds na ds.instance_name=d.name a ds.counter_name jako N'Data File(s) Size (KB)%'where d.database_id>4; -- databáze systému je haricWITH SizeDisc AS( -- nezobrazuje se velikost disku a volná velikost bilgisiSELECT SUM(TotalSize) jako 'Total_Disc_Sizeon_Server_MB', SUM(FreeSpace) jako 'Total_Free_Disc_SizeOn_Server,#DROM'FROMfo *Fdrives #DROM)FROM SizeDiscDROP TABLE #Drives DROP TABLE #DatabaseInfoDROP TABLE #CPUInfo GO/**************************************** ******************//* Zakázání procedur automatizace Ole */sp_configure 'zobrazit pokročilé možnosti', 1;GORECONFIGURE;GOsp_configure 'Procedury automatizace Ole', 0;GORECONFIGURE;/ ******************************************************* *****/GO
Výstup skriptu je následující.
V dalším článku budu pokračovat ve vysvětlování potíží s výkonem serveru SQL Server.
Řešení problémů s výkonem serveru SQL -5 Použití SQL Server Profiler