Самый полезный инструмент для DBA от Adam Machanic (sp_WhoIsActive)

Самый полезный инструмент для DBA от Adam Machanic (sp_WhoIsActive)Процедура Who is Active (sp_WhoIsActive):

Адам потратил на разработку этой процедуры более тысячи часов и она ДЕЙСТВИТЕЛЬНО будет вам незаменимым помощников в повседневной работе.

В этой статье будет представлена краткая вырезка из описания возможностей данной процедуры, полная инструкция от Адама описана на английском языке по ссылке.

Скачать процедуру

Данная процедура позволит вам понять что же действительно происходит с вашим сервером, кто и что вызывает нагрузку в данный момент времени. Ещё раз хочу обратить ваше внимание на то, что «Who Is Active» показывает только текущую активность сервера. Её можно использовать для сбора и последующего анализа данных.

Общая информация:

  • Внутри используется 15 DMV
  • Хранится в базе данных master, поэтому к ней можно обратиться из любого места кода
  • Необходимое разрешение для её работы — VIEW SERVER STATE
  • Работает на SQL Server 2005 и SQL Server 2008.
  • Вся активность агрегирована по сессии. Это значит, что сколько бы вы задач не выполняли от данной сессии, в настройках по-умолчанию, вы получите только 1, агрегированный результат по этой сессии

Варианты работы:

Сразу хочу оговориться, что все представленные тут параметры можно комбинировать.

Общая помощь по данной процедуре:

EXEC sp_WhoIsActive
     @help = 1

1. Можно особо не изучать процедуру и использовать её с параметрами по-умолчанию и она всё равно будет незаменимым помощником в вашей работе:

EXEC sp_WhoIsActive

F7_01_active_sleeping_thumb_39A85420

2. В настройках по-умолчанию скрыты некоторые сессии. Вот пример, как можно вывести их все:

		EXEC sp_WhoIsActive 
		@show_sleeping_spids = 2,  -- Показать спящие сессии
		@show_system_spids = 1, -- Показать системные сессии
		@show_own_spid = 1	--  Показать вашу собственную сессию

3. В столбце [sql_text] отображается только текущая операция, но если вы хотите видеть всю активность, то необходимо указать следующий параметр:

EXEC sp_WhoIsActive
     @get_full_inner_text = 1

4. Если вы хотите видеть что вызвало этот [sql_text], то вам необходимо добавить следующий параметр, который добавит колонку [sql_command]:

EXEC sp_WhoIsActive
     @get_outer_command = 1

5. К выводу можно добавить план выполнения. Обратите внимание что это достаточно дорогая операция. Применяйте её с осторожностью:

EXEC sp_WhoIsActive
     @get_plans = 1

6. Вывести в столбец [wait_info] не только самое важное ожидание, но и все остальные:

EXEC sp_WhoIsActive
     @get_task_info = 1

7. Отфильтровать вывод. Всегда помните, что фильтры совокупны/агрегированы для каждой сессии

EXEC sp_WhoIsActive 
     @filter_type = 'login', 
     @filter = 'Adam03\Adam'

8. Исключение из поиска (можно комбинировать с обычным фильтром):

EXEC sp_WhoIsActive 
     @not_filter_type = 'login', 
     @not_filter = 'blat';

9. Можно так же убрать агрегацию транзакций одной сессии и вывести их по отдельности:

sp_WhoIsActive
     @get_transaction_info = 1

10. Вывести более детальную информацию. Будет добавлен столбец [additional_info] с информацией в формате XML

sp_WhoIsActive
     @get_additional_info = 1

11. Можно посмотреть количество заблокированных процессов каждой сессией:

sp_WhoIsActive
     @find_block_leaders = 1

12. Указать сортировку вывода:

sp_WhoIsActive
     @sort_order = '[start_time] ASC'

13. Указать какие столбцы должны быть выведены:

sp_WhoIsActive
     @output_column_list= '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]'

14. Следующий параметр очень интересный. Он позволяет понять расход ресурсов в реальном времени. Вам достаточно задать величину в секундах, чтобы процедура начала собирать данные по каждой сессии с текущего момента и длиной в указанный вами промежуток времени.

sp_WhoIsActive
     @delta_interval = 10

Появятся дополнительные столбцы:

physical_io_delta
reads_delta
physical_reads_delta
writes_delta
tempdb_allocations_delta
tempdb_current_delta
CPU_delta
context_switches_delta
used_memory_delta

15. Получить результат в таблицу

-- Создать таблицу с нужной структурой
DECLARE @s VARCHAR(MAX)

EXEC sp_WhoIsActive 
	@format_output = 0, 
	@return_schema = 1, 
	@schema = @s OUTPUT

SET @s = REPLACE(@s, '<table_name>', 'tempdb.dbo.quick_debug')

EXEC(@s) 
GO

-- Поместить данные в созданную таблицу
EXEC sp_WhoIsActive 
	@format_output = 0, 
	@destination_table = 'tempdb.dbo.quick_debug'

GO

-- Сделать выборку из таблицы
SELECT * FROM tempdb.dbo.quick_debug

-- Удалить таблицу
DROP TABLE tempdb.dbo.quick_debug

 

Adam Machanic очень хорошо поработал для того, чтобы нам было легче работать. Данная процедура распространяется бесплатно, но вы всегда можете оставить свои пожертвования для человека, который проделал такой титанический труд. Adam Machanic рекомендует перечислять на его счёт по 40 USD за каждый используемый вами экземпляр сервера, где установлена его процедура. Благодарить создателя или нет решать только вам.

Ссылка для пожертвований (общая страница на английском языке)

Прямая ссылка для пожертвований

Запись опубликована в рубрике Скрипты с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Войти с помощью: