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.

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

Procedura ta wygeneruje skrypt tworzący tabelę:

01CREATE TABLE <table_name>
02(
03   [dd hh:mm:ss.mss] varchar(8000) NULL,
04   [session_id] smallint NOT NULL,
05   [sql_text] xml NULL,
06   [login_name] nvarchar(128) NOT NULL,
07   [wait_info] nvarchar(4000) NULL,
08   [CPU] varchar(30) NULL,
09   [tempdb_allocations] varchar(30) NULL,
10   [tempdb_current] varchar(30) NULL,
11   [blocking_session_id] smallint NULL,
12   [reads] varchar(30) NULL,
13   [writes] varchar(30) NULL,
14   [physical_reads] varchar(30) NULL,
15   [used_memory] varchar(30) NULL,
16   [status] varchar(30) NOT NULL,
17   [open_tran_count] varchar(30) NULL,
18   [percent_complete] varchar(30) NULL,
19   [host_name] nvarchar(128) NULL,
20   [database_name] nvarchar(128) NULL,
21   [program_name] nvarchar(128) NULL,
22   [start_time] datetime NOT NULL,
23   [login_time] datetime NULL,
24   [request_id] int NULL,
25   [collection_time] datetime NOT NULL
26)

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.

1-- generate a script to create a table that can save sp_whoisactive result
2declare @table_creation_script varchar(max);
3exec sp_whoisactive   @get_outer_command=1
4, @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]'
5, @find_block_leaders=1
6, @Schema = @table_creation_script output,  @return_schema=1;
7print @table_creation_script;

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

1exec sp_whoisactive   @get_outer_command=1
2,  @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]'
3, @find_block_leaders=1
4, @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