Jeśli zachodzi potrzeba gromadzenia danych generowanych przez procedurę sp_whoisactive w celu dalszej analizy należy je zapisać do tabeli. W tym celu najpierw trzeba utworzyć tabelę o odpowiedniej strukturze.

Jak to zrobić ?

Z pomocą przychodzi sama procedura.

Następujące polecenie wygeneruje kod potrzebny do utworzenia tabeli potrzebnej do przechowywania danych.

declare @table_creation_script varchar(max);
exec sp_whoisactive @Schema = @table_creation_script output, @return_schema=1;
print @table_creation_script;

Procedura ta wygeneruje skrypt tworzący tabelę:

CREATE TABLE <table_name>
( 
   [dd hh:mm:ss.mss] varchar(8000) NULL,
   [session_id] smallint NOT NULL,
   [sql_text] xml NULL,
   [login_name] nvarchar(128) NOT NULL,
   [wait_info] nvarchar(4000) NULL,
   [CPU] varchar(30) NULL,
   [tempdb_allocations] varchar(30) NULL,
   [tempdb_current] varchar(30) NULL,
   [blocking_session_id] smallint NULL,
   [reads] varchar(30) NULL,
   [writes] varchar(30) NULL,
   [physical_reads] varchar(30) NULL,
   [used_memory] varchar(30) NULL,
   [status] varchar(30) NOT NULL,
   [open_tran_count] varchar(30) NULL,
   [percent_complete] varchar(30) NULL,
   [host_name] nvarchar(128) NULL,
   [database_name] nvarchar(128) NULL,
   [program_name] nvarchar(128) NULL,
   [start_time] datetime NOT NULL,
   [login_time] datetime NULL,
   [request_id] int NULL,
   [collection_time] datetime NOT NULL
)

Wszystko, co teraz trzeba zrobić, to zastąpić ciąg „<table_name >” wybraną prawdziwą nazwą tabeli.

Należy zwrócić uwagę, że skrypt tworzący tabelę zawiera wiele kolumn, które są kolumnami domyślnymi po uruchomieniu sp_whoisactive bez żadnych parametrów – niekoniecznie potrzebne są wszystkie informacje. Z drugiej strony domyślna lista może nie zawierać tego, czego się oczekuje, na przykład może nie potrzebne są dla danego rozwiązania kolumny [request_id] lub [open_tran_count], ale za to potrzebne są kolumny, które mogą powiedzieć, która sesja jest na czele łańcucha blokowania w scenariusz blokowania wielu sesji.

Tak więc można zdefiniować listę kolumn, która jest we danym rozwiązaniu potrzebna, a następnie wygenerować ponownie skrypt tworzenia tabeli.

-- generate a script to create a table that can save sp_whoisactive result
declare @table_creation_script varchar(max);
exec sp_whoisactive   @get_outer_command=1
, @output_column_list = '[dd%][session_id][sql_command][sql_text][login_name][host_name][database_name][wait_info][blocking_session_id][blocked_session_count][percent_complete][cpu][used_memory][reads][writes][program_name][collection_time]'
, @find_block_leaders=1
, @Schema = @table_creation_script output,  @return_schema=1;
print @table_creation_script;

Dane zapisuje się do tabeli używając skryptu:

exec sp_whoisactive   @get_outer_command=1
,  @output_column_list = '[dd%][session_id][sql_command][sql_text][login_name][host_name][database_name][wait_info][blocking_session_id][blocked_session_count][percent_complete][cpu][used_memory][reads][writes][program_name][collection_time]'
, @find_block_leaders=1
, @destination_table = 'dbo.<table_name>';


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl