Co poradzić, gdy doskwiera brak SQL Profilera
SQL Profiler – jak zapewne większość wie – jest narzędziem pozwalającym śledzić pracę SQL Serwera. Chyba najbardziej popularnym jego wykorzystaniem, jest śledzenie poleceń SQL przesyłanych do serwera. Zapewne także większość wie, iż nie jest to narzędzie darmowe. Co zatem zrobić, kiedy posiadamy jedynie wersję Express SQL Serwera? Okazuje się, że wiele zadań SQL Profilera można zrealizować samodzielnie. W tym wpisie skupię się jedynie nad śledzeniem poleceń SQL.
Do zrealizowania wspomnianego zadania wykorzystamy dwa systemowe widoki dynamiczne: dm_exec_requests i dm_exec_query_stats oraz funkcję systemową: dm_exec_sql_text. Pokażę dwa przykłady uzyskania treści polecenia SQL – obecnie wykonywanego w wybranej sesji oraz treść wszystkich zbuforowanych przez serwer zapytań. Oto odpowiadające im skrypty SQL:
declare @spid int; set @spid = @@SPID; select r.command, case r.statement_start_offset / 2 when 0 then 1 else r.statement_start_offset/2 end as Start, (case r.statement_end_offset when -1 then Len(Convert(nvarchar(max), st.text)) * 2 else r.statement_end_offset end - r.statement_start_offset) / 2 as CmdLen, SubString(st.text, case r.statement_start_offset/2 when 0 then 1 else r.statement_start_offset/2 end, (case r.statement_end_offset when -1 then len(Convert(nvarchar(max), st.text)) * 2 else r.statement_end_offset end - r.statement_start_offset) / 2) as statement from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text(r.sql_handle) as st where r.session_id = @spid;
select qs.last_execution_time as [Time], st.text as [Query] from sys.dm_exec_query_stats as qs cross apply sys.dm_exec_sql_text(qs.sql_handle) as st order by qs.last_execution_time desc;
Dla pierwszego skryptu należy podań identyfikator sesji, której polecenie ma zostać zaprezentowane. W powyższym przykładzie jest to bieżąca sesja, zatem wynikiem działania skryptu będzie … jego treść ;). Należy pamiętać, że prezentowane jest aktualnie wykonywane polecenie, zatem w przypadku wybranej sesji należy trafić na właściwy moment – tj. wówczas, kiedy polecenie jest w jej ramach wykonywanie. Jeśli zakończy ono swoje działanie, to skrypt nie pokaże niczego. Listę aktywnych sesji można uzyskać chociażby za pomocą polecenia:
exec sp_who2;
Jeśli chodzi o drugi przykład, to należy zdawać sobie sprawę, że pokazuje on polecenia, które SQL Serwer zbuforował na swoje potrzeby. Może być ich zatem bardzo dużo, a w zależności od obciążenia serwera mogą obejmować zarówno szeroki jak i bardzo wąski przekrój czasowy. Niemniej skrypt zaprezentuje także polecenia wykonane tuż przed chwilą (z pominięciem samego siebie).