sql >> Databáze >  >> RDS >> Sqlserver

Použití DMV ( Dynamic Management View ) a DMF ( Dynamic Management Function ) | Řešení problémů s výkonem serveru SQL -4

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)
Transakce: Jsou to DMV a DMF, které poskytují potřebné informace o Transakci. Nejdůležitější jsou následující.
  • sys.dm_tran_active_transactions (DMV)
  • sys.dm_tran_session_transactions (DMV)
  • sys.dm_tran_database_transactions (DMV)
  • sys.dm_tran_current_transaction (DMV)
Pojďme použít DMV a DMF pro dotazování TOP 10 výpisů CPU. Můžete se dotazovat na TOP 10 výpisů CPU v databázi pomocí DMV a DMF, jak je uvedeno níže.

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_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(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


  1. SQL Vnitřní spojení

  2. Maximální délka textu typu MySQL

  3. Chyba události Mysql pomocí php

  4. PostgreSQL:Odeberte atribut ze sloupce JSON