Автоматизация учета

SQL сервер: Сбор и анализ статистики по выполняемым процедурам на продуктивном сервере

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

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

Перед нами стоит задача выявить «тяжелые» или часто используемые запросы в продуктивной среде,  проанализировать данные и выявить способ оптимизации.

По мотивам Finding the Causes of Poor Performance in SQL Server, Part 1 https://www.simple-talk.com/sql/performance/finding-the-causes-of-poor-performance-in-sql-server,-part-1/

Получение данных трассировки

С этой целью мы могли бы воспользоваться SQL Server Profiler, однако в условиях продуктивной среды его использование не рекомендуется 

Мы будем использовать трассировку на стороне сервера (server-side trace)

Создание скрипта трассировки

Для создания скрипта трассировки мы можем воспользоваться SQL server Profiler на тестовом сервере

Можно установить фильтр по базе данных.

После того как мы запустили и остановили трассировку, можно сгенерировать скрипт трассировки

После его открытия в SQL query мы получим сгенерированный скрипт:

/****************************************************/

/****************************************************/
/* Created by: SQL Server 2012  Profiler          */
/* Date: 22/09/2014  09:40:38         */
/****************************************************/


-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5 

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:MyFolderMyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
if (@rc != 0) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 146, 1, @on
exec sp_trace_setevent @TraceID, 146, 3, @on
exec sp_trace_setevent @TraceID, 146, 12, @on
exec sp_trace_setevent @TraceID, 146, 14, @on
exec sp_trace_setevent @TraceID, 146, 51, @on
exec sp_trace_setevent @TraceID, 10, 1, @on
exec sp_trace_setevent @TraceID, 10, 3, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 48, @on
exec sp_trace_setevent @TraceID, 10, 51, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 3, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 18, @on
exec sp_trace_setevent @TraceID, 12, 48, @on
exec sp_trace_setevent @TraceID, 12, 51, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

set @intfilter = 6
exec sp_trace_setfilter @TraceID, 3, 0, 0, @intfilter

set @bigintfilter = 1000
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter

-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go

Перед запуском его необходимо доработать. Добавим:

--указываем путь и имя файла
SET @OutputFileName = 'E:MSSQL_Trace' +
    CONVERT(VARCHAR(20), GETDATE(),112) +
    REPLACE(CONVERT(VARCHAR(20), GETDATE(),108),':','')

--время окончания через 30 мин
SET @EndTime = DATEADD(mi,30,getdate())

SELECT *
FROM   sys.traces;

Окончательная версия скрипта:

-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint

DECLARE @OutputFileName NVARCHAR(256) 
DECLARE @EndTime DATETIME

set @maxfilesize = 100

--указываем путь и имя файла
SET @OutputFileName = 'E:MSSQL_Trace' +
    CONVERT(VARCHAR(20), GETDATE(),112) +
    REPLACE(CONVERT(VARCHAR(20), GETDATE(),108),':','')

--время окончания через 30 мин
SET @EndTime = DATEADD(mi,30,getdate())

--трассировка прекратится при наступлении времени окончания
exec @rc = sp_trace_create @TraceID output, 0, @OutputFileName, @MaxFileSize, @EndTime

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 146, 1, @on
exec sp_trace_setevent @TraceID, 146, 3, @on
exec sp_trace_setevent @TraceID, 146, 12, @on
exec sp_trace_setevent @TraceID, 146, 14, @on
exec sp_trace_setevent @TraceID, 146, 51, @on
exec sp_trace_setevent @TraceID, 10, 1, @on
exec sp_trace_setevent @TraceID, 10, 3, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 48, @on
exec sp_trace_setevent @TraceID, 10, 51, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 3, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 18, @on
exec sp_trace_setevent @TraceID, 12, 48, @on
exec sp_trace_setevent @TraceID, 12, 51, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

set @intfilter = 6
exec sp_trace_setfilter @TraceID, 3, 0, 0, @intfilter

set @bigintfilter = 1
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter

-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1


SELECT *
FROM   sys.traces;

Осталось запустить трассировку в пик нагрузки и подождать полчаса.

Расшифровка трассировки

Поместим данные расшифровки в таблицу SQL. Я использую отдельную вспомогательную базу.

USE [ExchangeDB]

CREATE TABLE TraceResults (
 EventClass VARCHAR(100),
 TextData VARCHAR(4000),
 PlanXML XML,
 Duration INT,
 RowCounts INT,
 Reads INT,
 Writes INT,
 CPU INT,
 StartTime DATETIME,
 ProcedureName VARCHAR(100),
 EventSequence INT
)
GO

DECLARE @FileName NVARCHAR(256) 
SET @FileName = 'E:MSSQL_Trace20140922101559.trc'
 
INSERT INTO TraceResults
	(EventClass, TextData, Duration, Reads, RowCounts, Writes, CPU, StartTime, EventSequence)
SELECT EventClass, Convert(VARCHAR(4000),TextData) as TextData, 
	Duration, RowCounts, Reads, Writes, CPU, StartTime, EventSequence
FROM fn_trace_gettable(@FileName,1)
WHERE EventClass 146

UPDATE TraceResults
	SET ProcedureName =
	Convert(VARCHAR(100),TextData)
WHERE ProcedureName is NULL

INSERT INTO TraceResults
	(EventClass, PlanXML, EventSequence)
SELECT EventClass, 
	Convert(XML,TextData) as PlanXML,
	EventSequence
FROM fn_trace_gettable(@FileName,1)
WHERE EventClass = 146

Теперь осталось сформировать несколько запросов к нашей таблице для анализа результатов трассировки. Простые запросы приводить не буду, покажу лишь два примера. Первый отбирает запросы по длительности в порядке убывания:

SELECT        
	 TR1.EventSequence
	,TR2.EventSequence
	,TR1.TextData
	,TR2.PlanXML
	,TR1.Duration AS Duration
	,TR1.Reads
	,TR1.Writes
	,TR1.CPU
	,TR1.StartTime
FROM  dbo.TraceResults AS TR1 
     LEFT OUTER JOIN
        dbo.TraceResults AS TR2 
		ON TR1.EventSequence-1 = TR2.EventSequence

WHERE (TR1.TextData IS NOT NULL 
      AND TR2.PlanXML IS NOT NULL)

ORDER BY Duration Desc

Второй группирует по полю ProcedureName и суммирует данные по показателям

USE [ExchangeDB]


SELECT
	 TR1.EventSequence
	,TR2.EventSequence 
	,TR1.ProcedureName
	,TR2.PlanXML 
	,TR1.DurationTot
	,TR1.RowCountsTot
	,TR1.ReadsTot
	,TR1.WritesTot
	,TR1.CPUTot
FROM
(   SELECT 
	   ProcedureName 
	  ,MAX(EventSequence) AS EventSequence
         ,SUM(Duration) as DurationTot
         ,SUM(Reads) as ReadsTot
	  ,SUM(RowCounts) as RowCountsTot
         ,SUM(Writes) as WritesTot
         ,SUM(CPU) as CPUTot
   FROM TraceResults 
   GROUP BY ProcedureName) TR1
LEFT OUTER JOIN
			dbo.TraceResults AS TR2 
			ON TR1.EventSequence-1 = TR2.EventSequence
WHERE (TR1.ProcedureName IS NOT NULL 
      AND TR2.PlanXML IS NOT NULL)

ORDER BY DurationTot DESC

В нашем случае, по итогам двух запросов, лидирует вставка во временную таблицу #tt14 PlanXML из первой строчки:

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

Начать дискуссию

🧠Синий мозгонапрягатель. Пятница, коллеги

Прикольное задание. Можете посоревноваться на время с коллегами.

🧠Синий мозгонапрягатель. Пятница,  коллеги

Курсы повышения
квалификации

20
Официальное удостоверение с занесением в госреестр Рособрнадзора

Спецификация к договору поставки в 2024 году

Заключая договор поставки, контрагенты нередко согласовывают лишь общие моменты. Конкретные условия поставки прописывают позже в отдельном документе — спецификации. Как правильно составить такой документ, на какие нюансы обратить внимание, расскажем в нашей статье, а также приведем образец, доступный для скачивания.

Иллюстрация: freepik/freepik

Как перенести отпуск сотрудника, если он утвержден графиком отпусков

График отпусков обязателен как для сотрудника, так и для работодателя. При этом сотрудник может перенести отпуск на другой срок с согласия руководителя.

Иллюстрация: Вера Ревина/Клерк.ру
Лучшие спикеры, новый каждый день

Присылать уведомления о судебных процессах будут в автоматическом режиме

На Госуслугах оповещения о ходе судебных разбирательств начнут присылать всем участникам процесса, а не только тем, кто заранее подключил эту опцию на портале.

Дополнительная работа по своей инициативе — не основание для доплаты сверхурочных. Судебная практика

Еще одно интересное судебное решение нашла. Работник потребовал у работодателя доплату за сверхурочную работу, работодатель отказался, разбираться пошли в суд.

Иллюстрация: Вера Ревина/Клерк.ру

Мониторинг самозанятых с 1 марта 2024 года

С этой даты налоговики объявили крестовый поход против нелегальной занятости и уклонения от уплаты налогов с сумм, которые платят физическим лицам. В зону особого внимания попадут заказчики, которые привлекают для выполнения работ, оказания услуг плательщиков НПД. Рассказываем о том, какие риски учесть, если вы относитесь к этим лицам.

Мониторинг самозанятых с 1 марта 2024 года
Опытом делятся эксперты-практики, без воды

Три новости на Клерке: Ашан, Эвотор и популярность за еду

В создании любого продукта должны участвовать люди, которые считают юнит-экономику и отвечают за продукт. Это продакт-менеджеры. Мы это поняли, и поэтому у меня важные продуктовые новости.

Три новости на Клерке: Ашан, Эвотор и популярность за еду
1
УСН

Нужен ли кассовый чек при закупке товаров у физлица для перепродажи на УСН

НК напрямую не регулирует, какие документы нужны для обоснования расходов по УСН при покупке товаров у физического лица для последующей перепродажи.

Зарплата

Можно ли маленькую зарплату выдавать 1 раз в месяц и не делить на части

Роструд разъяснил, можно ли при работе на неполной ставке от МРОТ получать зарплату 1 раз в месяц без разделения на аванс и основную часть.

Ипотека

Минфин: в июле ипотека под 8% закончится

Власти пришли к консенсусу и не будут продлевать программу льготного кредитования для тех, кто хочет приобрести жилье в новостройках под 8% годовых.

НДФЛ

Часть подарка от работодателя не облагается НДФЛ

Если работодатель подарил подарок за 12 700 рублей, то НДФЛ он должен удержать с суммы 8 700 руб.

Российские бренды заняли все свободные торговые площади

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

Миникурсы, текстовые и видеоинструкции для бухгалтеров

Дарим топовый онлайн-курс «Бухгалтер маркетплейсов - 2024» с подпиской «Клерк.Премиум»

При покупке подписки «Клерк.Премиум» от полугода вы получаете наш флагманский курс «Бухгалтер маркетплейсов - 2024: учет, налоги, 1С» бесплатно!

Чем финансовая аренда отличается от операционной

Арендодатель обязан классифицировать аренду как финансовую или операционную — так предписывает великий и ужасный ФСБУ 25/2018. Объясняю, в чем разница и почему нельзя считать любую аренду операционной. Даже если очень хочется.

Чем финансовая аренда отличается от операционной

Из-за маркировки будет новая форма декларации по акцизам на табак и вейпы

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

🔥 Акция «Жаркие скидки в любую погоду»! Самые горячие онлайн-курсы «Клерка» за 4 290 рублей до 17 мая

Сегодня последний день, когда вы можете купить онлайн-курсы по учету на маркетплейсах, УСН, ВЭД, финмоделированию, ФСБУ и бухгалтерии с нуля за 4 290 рублей. Получите знания для работы на новом участке, станьте более уверенным и высокооплачиваемым специалистом!

☀️ Акция —«Жаркие скидки в любую погоду»! Самые горячие онлайн-курсы «Клерка» за 4 290 рублей до 17 мая

Сегодня последний день, когда вы можете купить онлайн-курсы по учету на маркетплейсах, УСН, ВЭД, финмоделированию, ФСБУ и бухгалтерии с нуля за 4 290 рублей. Получите знания для работы на новом участке, станьте более уверенным и высокооплачиваемым специалистом!

☀️ Акция —«Жаркие скидки в любую погоду»! Самые горячие онлайн-курсы «Клерка» за 4 290 рублей до 17 мая
2

💥Обзор новостей: «Силе Сибири 2» быть, всплески заражения оспой обезьян и гемолитическим стрептококком, отели Сочи самые дорогие

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

Безвизовый режим могут открыть с еще одной страной

Туристы смогут проводить в Малайзии без визы до 30 дней.

Интересные материалы

Помогли клиенту отбиться от необычного иска

Несколько месяцев назад клиент, которому ранее уже помогал по проблемным вопросам, в том числе отбиться от субсидиарки на немыслимую сумму в 13 млрд руб., обратился ко мне с просьбой помочь в ещё одном деле.