Biodro>
W tej serii artykułów będę dalej wyjaśniać, jak rozwiązywać problemy z wydajnością SQL Server.
Rozwiązywanie problemów z wydajnością serwera SQL
Przeczytaj wcześniejszy artykuł.
Monitorowanie liczników wydajności za pomocą PERFMON | Rozwiązywanie problemów z wydajnością serwera SQL -3
DMV (widok zarządzania dynamicznego)
Dzięki DMV (widoki zarządzania dynamicznego) i DMF (funkcje zarządzania dynamicznego) wprowadzone w SQL Server 2005, możesz monitorować wszystkie działania wykonywane w bazie danych, stan wydajności i wyświetlać informacje o systemie w celu zarządzania i monitorowania baz danych.
Wszystkie bazy danych (Oracle, SQL Server, MySQL, Sybase, PostreSQL, DB2 itp.) gromadzą niektóre wewnętrzne informacje (sesje, procesy itp. i ich statystyki) o systemie i dostarczają te dane jako tabele systemowe i widoki.
Aby uzyskać informacje o systemie operacyjnym i bazie danych, następujące informacje są ogólnie dostępne w tabelach systemowych, które są okresowo aktualizowane przez SQL Server.
- Ogólne informacje o bazie danych i serwerze bazy danych (nazwa, wydanie, wersja, zestaw znaków itp.)
- Aktywne zapytania
- Wykorzystanie procesora, we/wy i pamięci przez aktywne zapytania
- Plan wykonania
- Indeks używany przez uruchomione zapytanie
- Oczekiwanie we/wy w pamięci, dysku i sieci
- Brakujące indeksy, które niekorzystnie wpływają na wydajność bazy danych
- Współczynniki wykorzystania indeksów (Skanuj, Szukaj wartości)
- Czas odpowiedzi dysków
DMF (funkcja zarządzania dynamicznego)
Chociaż DMV i DMF wydają się takie same w SQL Server, różnicę między nimi można bezpośrednio sprawdzić jako nazwę DMV, podczas gdy DMF to funkcje, które pobierają parametr i odpowiednio zwracają tabelę.
Dzięki DMV i DMF możesz monitorować krytyczne bazy danych działające jako produkcja, natychmiast identyfikować problemy i podejmować odpowiednie działania. Za pomocą tych zapytań możesz odpytywać większość instrukcji dotyczących procesora, we/wy i pamięci z aktywnych zapytań w bazie danych, znaleźć brakujące tabele indeksów i znaleźć wolno działające zapytania.
Wszystkie DMV i DMF dostępne w SQL Server można zapytać za pomocą następującego zapytania.
wybierz nazwę,type_desc z sys.system_objects, gdzie nazwa taka jak „dm%” uporządkowana według nazwy;
Te DMV i DMF używane w programie SQL Server dostarczają użytkownikom informacje według kategorii, takich jak sesja, baza danych, system operacyjny (system operacyjny), transakcja itp. Na przykład; DMV i DMF w kategorii bazy danych zaczynają się od sys.dm_db lub DMV i DMF związane z transakcjami zaczynają się od sys.dm_tran .
Lista DMV i DMF według kategorii jest następująca.
Najczęściej używane DMV i DMF są jak poniżej.
Wykonywanie (SQL, zapytanie, proces itp.): DMV i DMF aktywnych zapytań, które dostarczają informacji, takich jak użytkownik wywoływany z jakiej maszyny, procesy, szacowany czas zakończenia i statystyki zapytań.
Najważniejsze z nich są następujące.
- 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)
Baza danych: To właśnie DMV i DMF dostarczają niezbędnych informacji o indeksowaniu, dublowaniu i partycjonowaniu na poziomie bazy danych. Najważniejsze z nich są następujące.
- 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)
System operacyjny: To DMV i DMF dostarcza niezbędnych informacji o systemie operacyjnym. Najważniejsze z nich są następujące.
- 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)
wybierz 10 pierwszych przypadków, gdy sql_handle JEST NULL, a następnie '' else ( substring(st.text,(qs.statement_start_offset+2)/2, ( przypadek, gdy 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)/(execution_count*1000 ) jako [Śr.CzasCPU], całkowita_odczyty_logiczne jako [Odczyty_logiczne], całkowita_liczba_zapisów_logicznych jako [logiczneWrites], liczba_wykonań, czas_utworzenia, czas_ostatniego_wykonania, całkowita_odczyty_logiczne+całkowita_zapisy_logiczne jako [AggIO], (całkowita_liczba_odczytów_logicznych+całkowita_db+(nazwa_logicznej]liczba_zapisów) st.dbid) jako database_name, st.objectid jako object_idfrom sys.dm_exec_query_stats qs zastosowanie krzyżowe sys.dm_exec_sql_text(sql_handle) st KRZYŻ ZASTOSUJ sys.dm_exec_query_plan(qs.plan_handle) JAKO qp gdzie total_worker_time> 0 order by total_worker_time desc;
Kiedy uruchomię powyższe zapytanie w testowej bazie danych AdventureWorks, której użyłem do moich testów, dane wyjściowe będą następujące.
Udostępnię skrypt ( Uwzględnij system operacyjny i bazę danych DMV i DMF ), który zawiera ogólne informacje o systemie operacyjnym, w którym działa instancja bazy danych SQL Server, takie jak całkowity procesor, pamięć, całkowity rozmiar dysku, rozmiar bazy danych i rozmiar dziennika transakcji.
Ten skrypt jest szczególnie potrzebny podczas przygotowywania inwentaryzacji bazy danych.
sp_configure 'pokaż opcje zaawansowane', 1;GORECONFIGURE;GOsp_configure 'Ole Procedury automatyzacji', 1;GORECONFIGURE;GO/************************* ********************************/SET NOCOUNT ONDECLARE @hr intDECLARE @fso intDECLARE @drive char(1)DECLARE @ odrive intDECLARE @TotalSize varchar(20) DECLARE @MB Numeryczne; 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 LOCAL FAST_FORWARDFOR SELECT dysk z #drives ORDER by driveOPEN dcur FETCH NEXT FROM dcur INTO @driveWHILE @@FETCH_STATUS=0BEGINEXEC'GetDrive @spf_O 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 przykł[email protected]/@MB [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 jako ' ', FreeSpace jako 'Free(MB)' FROM #drives--ORDER BY drive
CREATE TABLE #CPUInfo(Logical_CPU_Count bigint, Hyperthread_Ratio bigint, Physical_CPU_Count bigint, Physical_Memory_MB bigint)
WSTAW DO #CPUInfo(Liczba_logicznych_CPU,Współczynnik_hiperwątku,Współczynnik_fizycznych_CPU,Liczba_pamięci_fizycznych_MB)SELECT liczba_cpu_liczba AS [liczba_logicznych_procesorów] ,współczynnik_hiperwątku AS [współczynnik_hiperwątkowości] ,liczba_cpu/współczynnik_hiperwątku_sysm_ROM. pre>CREATE TABLE #DatabaseInfo(Nazwa_maszyny varchar(50), Nazwa_instancji varchar(50), Nazwa_serwera_Sql varchar(50), Total_Database_log_size_MB bigint, Total_Database_log_used_MBbase, Total_Database_Data_File_Size_MB_Server_Name Bigint, SERTce_ERTstan_Database_MB bigint, Total_Database_log_used_MB_base, Total_Database_Data_File_Size_MB_Server_Name Bigint, SERTce_ERTstan_Inteligt_Bazy danych Total_Database_Data_File_Size_MB)select convert(varchar(50),serverproperty('MachineName')) 'Machine_Name' ,convert(varchar(50),isnull(serverproperty('InstanceName'),'mssqlserver')) 'Instance_varchar(convert() 50),@@NAZWA_SERWERA) 'Nazwa_Sql_Server' ,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_value/1024) as [Total_Database_Total] sys.databases d lewe sprzężenie zewnętrzne sys.dm_os_performance_counters jako lu na lu.instance_name=d.name i lu.counter_name jak N'Log File(s) Używany rozmiar (KB)%' lewe sprzężenie zewnętrzne sys.dm_os_performance_counters jako ls na ls. insta nce_name=d.name i ls.counter_name jak N'Log File(s) Size (KB)%' i ls.cntr_value> 0 lewe złącze zewnętrzne sys.dm_os_performance_counters jako lp na lp.instance_name=d.name i lp.counter_name jak N'Percent Log Used%' lewe złącze zewnętrzne sys.dm_os_performance_counters jako ds na ds.instance_name=d.name i ds.counter_name jak N'Rozmiar pliku(ów) danych (KB)%'gdzie d.database_id>4; -- systemowa baza danych lub haricWITH SizeDisc AS( -- sunucu üzerindeki tüm drive size ve free size bilgisiSELECT SUM(TotalSize) jako 'Total_Disc_Sizeon_Server_MB', SUM(FreeSpace) jako 'Total_Free_Disc_Size)',#ROMdrive_InfosInfos,#ROMdrive_Disc_SizeOn_#ROM SizeDiscDROP TABLE #Dyski DROP TABLE #DatabaseInfoDROP TABLE #CPUInfo GO/**************************************** ******************//* Wyłączanie procedur automatyzacji Ole */sp_configure 'pokaż opcje zaawansowane', 1;GORECONFIGURE;GOsp_configure 'Procedury automatyzacji ole', 0;GORECONFIGURE;/ ************************************************** *****/GO
Wynik skryptu jest następujący.
W następnym artykule wyjaśnię rozwiązywanie problemów z wydajnością serwera SQL.
Rozwiązywanie problemów z wydajnością programu SQL Server -5 Korzystanie z programu SQL Server Profiler