Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как сократить максимальное время выполнения запроса?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1382
Дано: Запросы по вставке данных из табличного представления в таблицу с колоночным кластерным индексом, выполняющиеся каждую ночь - сначала запись данных из вьюхи во временную таблицу, а из неё - в таблицу с columnstore. При этом, суммарное время выполнения запросов может колебаться от семнадцати минут до пяти часов. И самое интересное, число записей не коррелирует с временем выполнения запросов.

Так как запросы запускаются ночью параллельно с заданием на бэкап всех баз, то вопрос - как может влиять процесс бэкапа базы на скорость выполнения запросов?

Встретил на форуме [url=]https://www.sql.ru/forum/778661/backup-i-blokirovka-raboty-bazy[/url] мнение
МуМу
Напрямую бэкап не может приводить к блокировке а вот косвенно может приводить к блокировке на ресурсах. В результате бэкапа возникает высокая нагрузка в результате чего увеличивается среднее время транзакций и совместно с ними и время блокировок.


И вот как это всё ускорить?
13 авг 19, 15:40    [21948251]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
aleks222
Member

Откуда:
Сообщений: 709
DaniilSeryi
И самое интересное, число записей не коррелирует с временем выполнения запросов.

Прямо шахерезада какая-то. Сказки рассказывает.

Чо, 1 (одна) запись вставляется 5 часов?
13 авг 19, 16:11    [21948286]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 31989
Блог
вставлять в пустую таблицу без индексов в несколько потоков, затем создать индексы и переключить эту таблицу как секцию в целевую таблицу
13 авг 19, 16:12    [21948288]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 31989
Блог
DaniilSeryi,

ну и проблемы у вас могут быть отнюдь не на вставку, например, одна из таблиц вьюхи заблокирована
13 авг 19, 16:17    [21948300]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6626
DaniilSeryi,

то есть неизвестно - на каком запросе появляются задержки?
13 авг 19, 16:40    [21948337]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1382
Владислав Колосов
DaniilSeryi,

то есть неизвестно - на каком запросе появляются задержки?


Нет. Завтра доработаю журналирование.

Критик
DaniilSeryi,

ну и проблемы у вас могут быть отнюдь не на вставку, например, одна из таблиц вьюхи заблокирована


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

Так как нагрузка на продуктовый сервер мне не нужна, то, по идее, Profiler не подходит. Так как с кем из админов не поговоришь - все утверждают, что профайлер сильно грузит сервер.

Другой вариант - sp_configure 'blocked process threshold (s)' + Extended Events. Про то, какую нагрузку создаст этот вариант - не в курсе. Кто подскажет?

Третий вариант - раз в 10-15 минут дергать sp_who2 и записывать её отфильтрованный результат в базу. В принципе, можно совместить с получением кода блокированной и блокирующей сессий.

Четвёртый вариант - периодическое дёрганье этого скрипта с записью в таблицу:
SELECT  blocking.session_id AS blocking_session_id ,
	blocked.session_id AS blocked_session_id ,
	waitstats.wait_type AS blocking_resource ,
	waitstats.wait_duration_ms/1000 as wait_duration_sec ,
	waitstats.wait_duration_ms/1000/60 as wait_duration_min ,
	waitstats.wait_duration_ms/1000/60/60 as wait_duration_hour ,
	waitstats.resource_description ,
	blocked_cache.text AS blocked_text ,
	blocking_cache.text AS blocking_text
FROM    sys.dm_exec_connections AS blocking
	INNER JOIN sys.dm_exec_requests blocked
		ON blocking.session_id = blocked.blocking_session_id
	CROSS APPLY sys.dm_exec_sql_text(blocked.sql_handle)
						blocked_cache
	CROSS APPLY sys.dm_exec_sql_text(blocking.most_recent_sql_handle)
						blocking_cache
	INNER JOIN sys.dm_os_waiting_tasks waitstats
		ON waitstats.session_id = blocked.session_id
13 авг 19, 17:58    [21948463]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1382
aleks222
DaniilSeryi
И самое интересное, число записей не коррелирует с временем выполнения запросов.

Прямо шахерезада какая-то. Сказки рассказывает.

Чо, 1 (одна) запись вставляется 5 часов?


Были случаи когда полмиллиона строк вставлялись 5 часов, а два миллиона - 15 минут.
13 авг 19, 18:04    [21948470]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
andy st
Member

Откуда:
Сообщений: 737
DaniilSeryi,
Натрави на сервер SQLBlocks, для начальной оценки масштабов блокировок хватит.
Если админы знают о проблеме "17 минут-5 часов" и втирают, что профайлер будет сильно грузить сервер, то они либо ленивы, либо заинтересованы в том, чтобы проблема не исследовалась нормальными средствами - ночами майнят эфир :)
Не совпадает ли 5 часов с полным бекапом баз, а минуты - с дифференциальными или логами?
Не делается ли бекап на тот же диск, где лежат базы и где расположены файлы целевой таблицы?
Не зависает ли еще какая-нибудь закачка на "много часов", которая выполняется как раз когда целевая табличка заполняется 5 часов?
13 авг 19, 18:25    [21948479]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28878
DaniilSeryi
Встретил на форуме мнение

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

Явно тут дело в блокировке какого то ресурса, типа блокировки схемы, при выделении нового сегмента для колумнстор индекса (не изучал, это на уровне фантазий).

Вот некая информация о механизмах, блокировках, может, сумеете там что то почерпнуть: https://www.mssqltips.com/sqlservertip/4280/sql-server-2016-columnstore-index-enhancements--system-views-for-diskbased-tables/
13 авг 19, 21:49    [21948622]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
uaggster
Member

Откуда:
Сообщений: 673
DaniilSeryi
Дано: Запросы по вставке данных из табличного представления в таблицу с колоночным кластерным индексом, выполняющиеся каждую ночь - сначала запись данных из вьюхи во временную таблицу, а из неё - в таблицу с columnstore. При этом, суммарное время выполнения запросов может колебаться от семнадцати минут до пяти часов. И самое интересное, число записей не коррелирует с временем выполнения запросов.

Так как запросы запускаются ночью параллельно с заданием на бэкап всех баз, то вопрос - как может влиять процесс бэкапа базы на скорость выполнения запросов?

Встретил на форуме [url=]https://www.sql.ru/forum/778661/backup-i-blokirovka-raboty-bazy[/url] мнение
МуМу
Напрямую бэкап не может приводить к блокировке а вот косвенно может приводить к блокировке на ресурсах. В результате бэкапа возникает высокая нагрузка в результате чего увеличивается среднее время транзакций и совместно с ними и время блокировок.


И вот как это всё ускорить?

Извините, а полка у вас какая? Ну, дисковая подсистема?
Шпиндели, на 4000 иопс суммарно, сферических, в вакууме? И вы запускаете бэкап пары десятков баз и параллельно со всем этим выгрузку и загрузку?
Я правильно угадал?
Ну, тогда ответ: "Процесс бэкапа баз будет влиять на скорость выполнения запросов - негативно".
14 авг 19, 09:45    [21948842]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 31989
Блог
DaniilSeryi,

sp_whoisactive поставить в расписание, скажем, раз в 10 минут
14 авг 19, 18:08    [21949531]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2280
DaniilSeryi
Так как нагрузка на продуктовый сервер мне не нужна, то, по идее, Profiler не подходит. Так как с кем из админов не поговоришь - все утверждают, что профайлер сильно грузит сервер.

Другой вариант - sp_configure 'blocked process threshold (s)' + Extended Events. Про то, какую нагрузку создаст этот вариант - не в курсе. Кто подскажет?
А чё админы сами не настроят мониторинг? Так то это их работа.
XEvents это самый легковесный и точный способ мониторинга блокировок. Немного нагрузки будет только в момент парсинга дурацкого XML. Если там вообще будет что просить.
Запускать же что то каждые 15 минут - бред хотя бы потому, а что если блокировка длилась 3 минуты? Отслеживать так долгие запросы - да, ловить так блокировки я бы не стал.
Профайлер только по блокировкам не намного хуже, но только не сам профайлер, а просто серверный трейс.
14 авг 19, 22:30    [21949666]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2280
alexeyvg
Явно тут дело в блокировке какого то ресурса, типа блокировки схемы, при выделении нового сегмента для колумнстор индекса (не изучал, это на уровне фантазий).
Телепат? Это может быть что угодно, включая слетающие периодически планы. Но блокировки конечно надо проверить.
Кстати, совсем забыл. их де можно легко вытащить из логов system health. Даже не настраивая ничего предварительно.
14 авг 19, 22:33    [21949669]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить максимальное время выполнения запроса?  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 262
DaniilSeryi,
Параллельный бэкап базы, в то время как другой процесс вставляет записи в таблицу этой базы - это просто мега-плохая идея!
Вы пробовали потом такой бекап отресторить? Процедура будет идти весьма продолжительно, так как DBE в начале процедуры бекапа работает с базой как в модели FULL, и даже если она SIMPLE - то переключает ее неявно в данный режим, и дописывает все транзакции в журнал, что происходили от точки начала операции резервного копирования и в ее процессе. Если такой бекап потом восстанавливать - то на этапе 100% - DBE начинает накатывать те самые транзакции из журнала что, как сказано выше - может быть весьма долго и затратно.

Если бекапы входят в DR-план, который надо по-хорошему тестировать время от времени - то есть риск не уложиться в RTO
15 авг 19, 08:57    [21949786]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить