Materiały konferencyjne Bazy Danych i Business Intelligence Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012. mgr inż.paweł Potasiński Warszawska Wyższa Szkoła Informatyki pawel.potasinski@gmail.com Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012. Selected uses of dynamic management views and functions in Microsoft SQL Server 2012 Streszczenie W artykule omówiono przykłady zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012. Podstawowa wiedza z tego zakresu jest niezbędna do sprawnego administrowania zasobami serwera baz danych. Słowa kluczowe: dynamiczny widok, plan wykonania, procedura składowana Abstract Dynamic management views and functions (DMV) are one of the most useful source of knowledge on how Microsoft SQL Server 2012 database system is performing. They can be extremely useful for database administrators and people specialized in performance tuning and optimization. In this article three uses of DMVs have been described. Keywords: dynamic view, execution plan, stored procedure 1. Wstęp Jednym ze źródeł informacji na temat funkcjonowania i zdrowia systemu Micosoft SQL Server 2012 są tak widoki jak i funkcje dynamiczne (ang. Dynamic Management Views DMV). Oferują one administratorowi baz danych dostęp do informacji o samym systemie, jak również o aktualnym stanie wielu liczników, na podstawie których można wyciągnąć wnioski na temat funkcjonowania baz danych i całej instancji SQL Server. Część widoków dynamicznych gromadzi dane dotyczące wybranego aspektu działania systemu od ostatniego uruchomienia usługi SQL Server, dzięki czemu można często stwierdzić, czy przeprowadzone przez administratora strojenia i optymalizacje przyniosły korzyści. Celem artykułu jest przedstawienie wybranych zastosowań widoków i funkcji dynamicznych w procesach strojenia i optymalizacji systemu SQL Server. W SQL Server 2012 w wersji RTM (numer wersji 11.0.2100) mamy do dyspozycji aż 177 widoków i funkcji dynamicznych. Pełną ich listę można wyświetlić wykonując poniższe zapytanie: sys. + name AS [Nazwa DMV], type_desc AS [Rodzaj obiektu] FROM sys.system_objects WHERE schema_id = 4 AND name LIKE dm[_]% ORDER BY dmv_name;
130 Bazy Danych i Business Intelligence Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012 Rys. 1 Zapytanie do wyświetlenia listy DMV. Powyższe zapytanie wykorzystuje fakt, że wszystkie widoki i funkcje dynamiczne są obiektami systemowymi (stąd zapytanie do widoku sys.system_objects zwracającego listę obiektów systemowych), znajdują się w schemacie sys oraz mają nazwy rozpoczynające się od prefiksu dm_. DMV są podzielone na kategorie oznaczone DMV dodatkowymi są podzielone prefiksami. na kategorie Listę tych oznaczone kategorii dodatkowymi wraz p kategorii wraz z ilością DMV należących do każdej z nich można z ilością DMV należących do każdej z nich można uzyskać wykonując następujące zapytanie: następujące zapytanie: ISNULL(LEFT(name,CHARINDEX( _,name,4)), <<All>> ) + * AS [Grupa DMV], COUNT(*) AS [Ilosc] ISNULL(LEFT(name,CHARINDEX('_',name,4)),'<<All>>') + '* FROM sys.system_objects COUNT(*) AS [Ilosc] WHERE schema_id = 4 AND name LIKE FROM dm[_]% sys.system_objects GROUP BY LEFT(name,CHARINDEX( _,name,4)) WHERE schema_id = 4 AND name LIKE 'dm[_]%' WITH ROLLUP GROUP BY LEFT(name,CHARINDEX('_',name,4)) ORDER BY LEFT(name,CHARINDEX( _,name,4)); WITH ROLLUP ORDER BY LEFT(name,CHARINDEX('_',name,4)); Rys. 2 Zapytanie do wyświetlenia grup DMV Rys. 2 Zapytanie do wyświetlenia grup DMV Wynik powyższego zapytania: Wynik powyższego zapytania: Rys. Rys. 3 Lista Lista grup grup DMV DMV A zatem w SQL Server 2012 istnieją 24 A grupy zatem DMV, w SQL z Server których 2012 najliczniejsza istnieją 24 (41 grupy DMV) DMV, jest z grupa których najlicz dm_os_* zawierająca widoki i funkcje poświęcone grupa dm_os_* wewnętrznemu zawierająca systemowi widoki operacyjnemu i funkcje poświęcone SQLOS wewn zaszytemu w systemie SQL Server. operacyjnemu SQLOS zaszytemu w systemie SQL Server. 2. Informacje o systemie Często zdarza się, że podczas pracy z systemem SQL Server adm nie ma bezpośredniego dostępu do serwera, na którym działa system danych. Dzieje się tak dlatego, że nie zawsze na serwerze baz da udostępniają zdalne konsole, dzięki którym można podłączać się bez
Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012 Bazy Danych i Business Intelligence 131 2. Informacje o systemie Często zdarza się, że podczas pracy z systemem SQL Server administrator lub audytor nie ma bezpośredniego dostępu do serwera, na którym działa system zarządzania bazami danych. Dzieje się tak dlatego, że nie zawsze na serwerze baz danych administratorzy udostępniają zdalne konsole, dzięki operacyjnego serwera. Jak wówczas sprawdzić parametry serwera i dowiedzieć się, którym można podłączać się bezpośrednio do systemu operacyjnego serwera. Jak wówczas sprawdzić konta parametry serwera i dowiedzieć operacyjnego w systemie się, jakie serwera. operacyjnym konta w Jak systemie wówczas zostały operacyjnym sprawdzić wykorzystane zostały parametry do uruchomienia wykorzystane serwera i do dowiedzieć usług związany uruchomienia usług związanych z systemem SQL Server? Odpowiedzią są DMV. się, systemem konta w systemie SQL Server? operacyjnym Odpowiedzią zostały są DMV. wykorzystane do uruchomienia usług związany systemem SQL Server? Odpowiedzią są DMV. Poniższe zapytanie do DMV o Poniższe nazwie sys.dm_os_sys_info zapytanie do DMV zwraca o nazwie podstawowe sys.dm_os_sys_info informacje o zasobach serwera, takich jak procesory informacje Poniższe i pamięć: o zasobach zapytanie serwera, do takich DMV jak o procesory nazwie sys.dm_os_sys_info i pamięć: zwraca podstaw zwraca podstaw informacje o zasobach serwera, takich jak procesory i pamięć: cpu_count AS [Logiczne procesory], cpu_count / hyperthread_ratio cpu_count AS AS [Fizyczne [Logiczne procesory], procesory], CONVERT(numeric(19,2), cpu_count physical_memory_kb AS / hyperthread_ratio [Logiczne procesory], / (1024 AS [Fizyczne * 1024.)) AS procesory], [Pamiec w GB], sqlserver_start_time AS CONVERT(numeric(19,2), cpu_count [Data startu / hyperthread_ratio systemu] physical_memory_kb AS [Fizyczne procesory], / (1024 * 1024.)) AS [Pamiec w GB], FROM sys.dm_os_sys_info; sqlserver_start_time CONVERT(numeric(19,2), AS [Data physical_memory_kb startu systemu] / (1024 * 1024.)) AS [Pamiec w GB], FROM sqlserver_start_time sys.dm_os_sys_info; AS [Data startu systemu] Rys. 4 Zapytanie do wyświetlania FROM sys.dm_os_sys_info; informacji o serwerze Rys. 4 Zapytanie do wyświetlania informacji o serwerze Wynik powyższego zapytania Rys. 4 Zapytanie może prezentować do wyświetlania się na przykład informacji tak: o serwerze Wynik powyższego zapytania może prezentować się na przykład tak: Wynik powyższego zapytania może prezentować się na przykład tak: Rys. 5 Rys. Wynik 5 Wynik zapytania zapytania o zasoby o zasoby serwera serwera Rys. 5 Wynik zapytania o zasoby serwera Na podstawie powyższego Na podstawie wyniku jesteśmy powyższego w stanie wyniku stwierdzić, jesteśmy że w dany stanie serwer stwierdzić, dysponuje że jednym dany serwer dysp procesorem o czterech rdzeniach jednym Na podstawie procesorem oraz ośmioma powyższego o czterech gigabajtami wyniku rdzeniach jesteśmy pamięci oraz operacyjnej, w ośmioma stanie stwierdzić, gigabajtami a także, że ostatnie dany pamięci serwer operacyjn dysp uruchomienie usługi SQL także, jednym Server że nastąpiło procesorem ostatnie 11 uruchomienie maja o czterech 2012 roku rdzeniach usługi o godzinie SQL oraz Server ośmioma 10:53. nastąpiło gigabajtami 11 maja pamięci 2012 roku operacyjn o god 10:53. także, że ostatnie uruchomienie usługi SQL Server nastąpiło 11 maja 2012 roku o god Z kolei, jeśli chcemy sprawdzić, 10:53. Z kolei, na jakich jeśli chcemy kontach sprawdzić, działają usługi na systemu jakich kontach SQL Server, działają możemy usługi systemu wykonać zapytanie do DMV Server, o nazwie możemy sys.dm_server_services: Z kolei, jeśli wykonać chcemy zapytanie sprawdzić, do DMV na o jakich nazwie kontach sys.dm_server_services: działają usługi systemu Server, możemy wykonać zapytanie do DMV o nazwie sys.dm_server_services: servicename AS [Usluga], servicename AS [Usluga], service_account AS [Konto], servicename service_account AS AS [Usluga], [Konto], status_desc AS [Stan] service_account status_desc AS [Stan] AS [Konto], FROM sys.dm_server_services; FROM status_desc sys.dm_server_services; AS [Stan] FROM sys.dm_server_services; Rys. 6 Zapytanie do sprawdzania Rys. 6 Zapytanie stanu usług do sprawdzania systemu SQL stanu Server usług systemu SQL Server Rys. 6 Zapytanie do sprawdzania stanu usług systemu SQL Server Przykładowy wynik: Przykładowy wynik: Przykładowy wynik: Rys. 7 Wynik zapytania o stan usług systemu SQL Server Rys. Rys. 7 7 Wynik Wynik zapytania zapytania o o stan stan usług usług systemu systemu SQL SQL Server Server Z powyższego wyniku można odczytać, że o ile dla każdej usługi zostało stworzone os Z konto powyższego lokalne w wyniku systemie można operacyjnym, odczytać, o że tyle o ile usługa dla każdej SQL Server usługi zostało Agent odpowiedzial stworzone os konto automatyzację lokalne w procesów systemie w operacyjnym, systemie SQL o Server tyle usługa jest zatrzymana SQL Server (Stan Agent = Stopped). odpowiedzial automatyzację procesów w systemie SQL Server jest zatrzymana (Stan = Stopped).
132 Bazy Danych i Business Intelligence Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012 Z powyższego wyniku można odczytać, że o ile dla każdej usługi zostało stworzone osobne konto lokalne w systemie operacyjnym, o tyle usługa SQL Server Agent odpowiedzialna za automatyzację procesów w systemie SQL Server jest zatrzymana (Stan = Stopped). 3. Na co czeka system? Jednym z często stosowanych podejść w rozwiązywaniu problemów z wydajnością systemu SQL Server jest badanie stanów oczekiwania systemu. Każda milisekunda oczekiwania każdej sesji / zapytania w systemie SQL Server jest kategoryzowana i zapisywana w swoistym pamiętniku. Dostęp do zagregowanych danych z tego pamiętnika daje administratorowi DMV o nazwie sys.dm_os_wait_stats. Konstruując stosowne zapytanie do tego widoku można uzyskać informacje o tym, na co najczęściej czeka system baz danych podczas realizacji zadań. Poniższe zapytanie wyświetli te kategorie stanów oczekiwania, które generują ponad 90% czasu oczekiwania systemu: WITH Waits AS ( wait_type, waiting_tasks_count, wait_time_ms / 1000. AS wait_time_s, 100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct, ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn FROM sys.dm_os_wait_stats WHERE wait_type NOT IN ( CLR_SEMAPHORE, LAZYWRITER_SLEEP, RESOURCE_QUEUE, SLEEP_TASK, SLEEP_SYSTEMTASK, SQLTRACE_BUFFER_FLUSH, WAITFOR, LOGMGR_QUEUE, CHECKPOINT_QUEUE, REQUEST_FOR_DEADLOCK_ SEARCH, XE_TIMER_EVENT, BROKER_TO_FLUSH, BROKER_TASK_STOP, CLR_MANUAL_ EVENT, CLR_AUTO_EVENT, DISPATCHER_QUEUE_SEMAPHORE, FT_IFTS_SCHEDULER_ IDLE_WAIT, XE_DISPATCHER_WAIT, XE_DISPATCHER_JOIN ) ) W1.wait_type AS [Kategoria], W1.waiting_tasks_count AS [Ilosc oczekiwan], CAST(W1.wait_time_s AS decimal(12, 2)) AS [Czas oczekiwania w sek.], CAST(W1.pct AS decimal(12, 2)) AS [Procent], CAST(SUM(W2.pct) AS decimal(12, 2)) AS [Procent w sumie] FROM Waits AS W1 INNER JOIN Waits AS W2 ON W2.rn <= W1.rn GROUP BY W1.rn, W1.wait_type, W1.waiting_tasks_count, W1.wait_time_s, W1.pct HAVING SUM(W2.pct) - W1.pct < 90; Rys 8. Zapytanie do wyświetlania stanów oczekiwania systemu
Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012 Bazy Danych i Business Intelligence 133 Powyższe zapytanie zostało skonstruowane tak, by nie pokazywać kategorii oczekiwania, które zazwyczaj mogą zostać zignorowane podczas monitorowania systemów SQL Server 2008 R2 i starszych wersji. Przykładowy wynik zapytania: Rys. 9 Przykładowe Rys. 9 stany Przykładowe oczekiwania stany systemu oczekiwania systemu Na podstawie powyższego wyniku można stwierdzić, że na badanej instancji SQL Server Na podstawie powyższego wyniku można stwierdzić, że na badanej instancji SQL Server najdłużej najdłużej (75% czasu oczekiwania) system oczekuje na zapis do dzienników transakcji baz (75% czasu oczekiwania) danych (kategoria system oczekuje WRITELOG). na zapis Może do dzienników to wskazywać transakcji na baz problemy danych (kategoria związane z WRITELOG). nieprawidłowym Może to wskazywać rozmieszczeniem na problemy związane plików z nieprawidłowym baz danych lub rozmieszczeniem zbyt wolnymi plików dyskami baz danych lub przeznaczonymi zbyt wolnymi dyskami na pliki przeznaczonymi dzienników transakcji. na pliki Dzięki dzienników takiej transakcji. analizie administrator Dzięki takiej może analizie administrator przystąpić może do przystąpić dalszego do monitorowania dalszego monitorowania ukierunkowanego ukierunkowanego na konkretne na konkretne problemy, problemy, przez co jest jest w w stanie stanie szybciej szybciej zdiagnozować przyczynę, przyczynę, dla dla której której operacje operacje w w systemie systemie trwają trwają dłużej, przez co dłużej, niż powinny. niż powinny. Kategorie stanów oczekiwania Kategorie stanów systemu oczekiwania SQL Server systemu opisane są SQL w dokumentacji Server opisane do są widoku w dokumentacji sys.dm_ do os_wait_stats (http://technet.microsoft.com/en-us/library/ms179984.aspx) widoku sys.dm_os_wait_stats (http://technet.microsoft.com/en-us/library/ms179984.aspx) oraz w bardzo dobrym, nadal aktualnym artykule oraz w SQL bardzo Server dobrym, 2005 Performance nadal aktualnym Tuning artykule using SQL the Server Waits and 2005 Queues Performance (http://technet. Tuning using microsoft.com/en-us/library/cc966413.aspx). the Waits and Queues (http://technet.microsoft.com/en-us/library/cc966413.aspx). 4. Plany wykonania 4. plany procedur wykonania składowanych procedur składowanych Procedury składowane Procedury są często składowane wykorzystywane są często przez wykorzystywane programistów baz przez danych programistów pracujących baz z systemem SQL Server. pracujących Dzięki z zastosowaniu systemem SQL procedur Server. programista Dzięki zastosowaniu może zaszyć procedur dowolny programista kod implementu- może zaszyć danych jący logikę biznesową dowolny w kod bazie implementujący danych, co upraszcza logikę proces biznesową utrzymania w bazie aplikacji. danych, Procedury co upraszcza dają także proces możliwość ograniczenia utrzymania dostępu aplikacji. użytkowników Procedury dają do tabel. także Wystarczy, możliwość że ograniczenia programista dostępu stworzy użytkowników stosowne procedury składowane tabel. Wystarczy, realizujące że operacje programista na wybranej stworzy tabeli stosowne i nada procedury użytkownikowi składowane uprawnienia realizujące do wykonywania operacje tych procedur, na wybranej a użytkownik tabeli i nada będzie użytkownikowi mógł realizować uprawnienia operacje modyfikacji do wykonywania danych tych w tabeli bez potrzeby procedur, posiadania a użytkownik uprawnień będzie na mógł samej realizować tabeli. Jednocześnie operacje modyfikacji za pomocą kodu danych zaszytego w tabeli bez w procedurach potrzeby programista posiadania może wprowadzić uprawnień własne na samej mechanizmy tabeli. Jednocześnie kontroli jakości za pomocą danych kodu oraz zaszytego przebiegu operacji. w procedurach programista może wprowadzić własne mechanizmy kontroli jakości danych oraz przebiegu operacji. Rozwiązywanie problemów Rozwiązywanie wydajnościowych problemów zaistniałych wydajnościowych w procedurach zaistniałych składowanych w nie należy procedurach do prostych zadań. składowanych Jeśli procedura nie realizuje należy do złożoną prostych logikę zadań. i dokonują Jeśli się procedura za pomocą realizuje jej kodu złożoną modyfikacje danych, uruchamianie dokonują się procedury za pomocą w celach jej kodu testowych modyfikacje nie wchodzi danych, często uruchamianie w grę. W takich procedury momentach w celach logikę i dobrym podejściem testowych jest odnalezienie nie wchodzi zapisanego często w grę. pamięci W planu takich wykonania momentach procedury dobrym i wykonanie podejściem jest analizy tego planu. odnalezienie Dostęp do zapisanego planów wykonania w pamięci oraz planu statystyk wykonania uruchamiania procedury procedur i wykonanie składowanych analizy tego można zrealizować planu. za Dostęp pomocą do następującego planów wykonania zapytania: oraz statystyk uruchamiania procedur składowanych można zrealizować za pomocą następującego zapytania: DB_NAME(p.database_id) AS [Baza danych], QUOTENAME(OBJECT_SCHEMA_NAME(p.[object_id], p.database_id)) +. + QUOTENAME(OBJECT_NAME(p.[object_id], p.database_id)) AS [Procedura],
Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012 134 Bazy Danych i Business Intelligence DB_NAME(p.database_id) AS [Baza danych], p.cached_time QUOTENAME(OBJECT_SCHEMA_NAME(p.[object_id], AS [Data zapisania planu], p.database_id)) + '.' + p.last_execution_time QUOTENAME(OBJECT_NAME(p.[object_id], AS [Data ostatniego wykonania], p.database_id)) AS [Procedura], p.execution_count p.cached_time AS AS [Data [Ilosc zapisania wykonan], planu], p.last_execution_time AS [Data ostatniego wykonania], CONVERT( p.execution_count AS [Ilosc wykonan], numeric(38,2), CONVERT( CASE numeric(38,2), WHEN CASE p.execution_count = 0 THEN WHEN 0 p.execution_count = 0 ELSE THEN p.total_elapsed_time 0 * 1.0 / p.execution_count END) ELSE AS [Sredni p.total_elapsed_time czas wykonania], * 1.0 / p.execution_count q.query_plan END) AS AS [Sredni [Plan] czas wykonania], FROM q.query_plan sys.dm_exec_procedure_stats AS [Plan] AS p CROSS FROM APPLY sys.dm_exec_procedure_stats sys.dm_exec_query_plan(p.plan_handle) AS p AS q WHERE CROSS p.database_id APPLY sys.dm_exec_query_plan(p.plan_handle) = DB_ID() AS q ORDER WHERE BY p.database_id p.execution_count = DB_ID() DESC; ORDER BY p.execution_count DESC; Rys. 10 Zapytanie do wyświetlania statystyk oraz planów wykonania procedur składowanych Rys. 10 Zapytanie do wyświetlania statystyk oraz planów wykonania procedur składowanych Zapytanie korzysta z DMV o nazwie sys.dm_exec_procedure_stats zwracającego statystyki wykonania procedur Zapytanie składowanych korzysta z DMV oraz z o funkcji nazwie sys.dm_exec_query_plan, sys.dm_exec_procedure_stats która zwracającego między statystyki innymi plan wykonania wykonania w formacie procedur XML. składowanych Przykładowy oraz wynik z funkcji powyższego sys.dm_exec_query_plan, zapytania dla bazy danych która Adventure- zwraca Works2012: między innymi plan wykonania w formacie XML. Przykładowy wynik powyższego zapytania dla bazy danych AdventureWorks2012: Rys. 11 Statystyki Rys. i plany 11 Statystyki wykonania i plany procedur wykonania składowanych procedur składowanych Narzędzie SQL Server Management Studio potrafi interpretować plany wykonania zapisane w formacie XML Narzędzie i wyświetlać SQL Server je w postaci Management graficznej. Studio Przykład potrafi takiego interpretować graficznego plany planu wykonania wykonania zapisane ilustruje rysunek w formacie 6. XML i wyświetlać je w postaci graficznej. Przykład takiego graficznego planu wykonania ilustruje rysunek 6. Rys. 12 Przykładowy Rys. 12 plan Przykładowy wykonania plan procedury wykonania składowanej procedury składowanej Mając plan wykonania procedury w postaci graficznej i w formacie XML, administrator może przeanalizować plan i dowiedzieć się, które polecenie w procedurze wykonywało się najdłużej i powodowało wykorzystanie największej ilości zasobów serwera. 5. podsumowanie
Wybrane zastosowania widoków i funkcji dynamicznych w systemie Microsoft SQL Server 2012 Bazy Danych i Business Intelligence 135 Mając plan wykonania procedury w postaci graficznej i w formacie XML, administrator może przeanalizować plan i dowiedzieć się, które polecenie w procedurze wykonywało się najdłużej i powodowało wykorzystanie największej ilości zasobów serwera. 5. Podsumowanie Widoki i funkcje dynamiczne to potężna broń w rękach osób pracujących z systemem Microsoft SQL Server. Dzięki ich znajomości administrator baz danych może uzyskać wiele cennych informacji, których użycie może prowadzić do rozwiązania nawet najbardziej skomplikowanych problemów zarówno z pojedynczymi poleceniami Transact-SQL, jak i z całą bazą danych, a nawet instancją systemu SQL Server. W artykule przedstawiłem zaledwie trzy możliwe zastosowania DMV, ale warto wymienić inne często spotykane zastosowania tych obiektów: monitorowanie sesji i połączeń w tym wystąpień problemu blokowania, poszukiwanie brakujących indeksów, monitorowanie użycia i fragmentacji indeksów, monitorowanie wykorzystania zasobów w bazie tempdb (obiekty tymczasowe), wyszukiwanie zależności między obiektami w bazach danych, przeszukiwanie bufora planów wykonania (np. celem znalezienia planów wykonania wykorzystujących wiele procesorów). Podsumowując, widoki i procedury dynamiczne powinien poznać każdy, kto sprawnie posługuje się językiem Transact-SQL, a chciałby mieć lepszą kontrolę nad procesami, które dzieją się w systemie SQL Server.