Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сократить максимальное время выполнения запроса? / 14 сообщений из 14, страница 1 из 1
13.08.2019, 15:40
    #39848854
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
Дано: Запросы по вставке данных из табличного представления в таблицу с колоночным кластерным индексом, выполняющиеся каждую ночь - сначала запись данных из вьюхи во временную таблицу, а из неё - в таблицу с columnstore. При этом, суммарное время выполнения запросов может колебаться от семнадцати минут до пяти часов. И самое интересное, число записей не коррелирует с временем выполнения запросов.

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

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

И вот как это всё ускорить?
...
Рейтинг: 0 / 0
13.08.2019, 16:11
    #39848866
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryiИ самое интересное, число записей не коррелирует с временем выполнения запросов.
Прямо шахерезада какая-то. Сказки рассказывает.

Чо, 1 (одна) запись вставляется 5 часов?
...
Рейтинг: 0 / 0
13.08.2019, 16:12
    #39848868
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
вставлять в пустую таблицу без индексов в несколько потоков, затем создать индексы и переключить эту таблицу как секцию в целевую таблицу
...
Рейтинг: 0 / 0
13.08.2019, 16:17
    #39848876
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryi,

ну и проблемы у вас могут быть отнюдь не на вставку, например, одна из таблиц вьюхи заблокирована
...
Рейтинг: 0 / 0
13.08.2019, 16:40
    #39848899
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryi,

то есть неизвестно - на каком запросе появляются задержки?
...
Рейтинг: 0 / 0
13.08.2019, 17:58
    #39848950
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
Владислав КолосовDaniilSeryi,

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

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

КритикDaniilSeryi,

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

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

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

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

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

Четвёртый вариант - периодическое дёрганье этого скрипта с записью в таблицу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
...
Рейтинг: 0 / 0
13.08.2019, 18:04
    #39848952
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
aleks222DaniilSeryiИ самое интересное, число записей не коррелирует с временем выполнения запросов.
Прямо шахерезада какая-то. Сказки рассказывает.

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

Были случаи когда полмиллиона строк вставлялись 5 часов, а два миллиона - 15 минут.
...
Рейтинг: 0 / 0
13.08.2019, 18:25
    #39848955
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryi,
Натрави на сервер SQLBlocks, для начальной оценки масштабов блокировок хватит.
Если админы знают о проблеме "17 минут-5 часов" и втирают, что профайлер будет сильно грузить сервер, то они либо ленивы, либо заинтересованы в том, чтобы проблема не исследовалась нормальными средствами - ночами майнят эфир :)
Не совпадает ли 5 часов с полным бекапом баз, а минуты - с дифференциальными или логами?
Не делается ли бекап на тот же диск, где лежат базы и где расположены файлы целевой таблицы?
Не зависает ли еще какая-нибудь закачка на "много часов", которая выполняется как раз когда целевая табличка заполняется 5 часов?
...
Рейтинг: 0 / 0
13.08.2019, 21:49
    #39848996
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryiВстретил на форуме мнение
Конечно, бакап потребляет ресурсы, и из за этого замедляются выполнение каких то других действий, требующих ресурсов, но объяснить этим колебания "от семнадцати минут до пяти часов" нельзя.

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

Вот некая информация о механизмах, блокировках, может, сумеете там что то почерпнуть: https://www.mssqltips.com/sqlservertip/4280/sql-server-2016-columnstore-index-enhancements--system-views-for-diskbased-tables/
...
Рейтинг: 0 / 0
14.08.2019, 09:45
    #39849084
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryiДано: Запросы по вставке данных из табличного представления в таблицу с колоночным кластерным индексом, выполняющиеся каждую ночь - сначала запись данных из вьюхи во временную таблицу, а из неё - в таблицу с columnstore. При этом, суммарное время выполнения запросов может колебаться от семнадцати минут до пяти часов. И самое интересное, число записей не коррелирует с временем выполнения запросов.

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

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

И вот как это всё ускорить?
Извините, а полка у вас какая? Ну, дисковая подсистема?
Шпиндели, на 4000 иопс суммарно, сферических, в вакууме? И вы запускаете бэкап пары десятков баз и параллельно со всем этим выгрузку и загрузку?
Я правильно угадал?
Ну, тогда ответ: "Процесс бэкапа баз будет влиять на скорость выполнения запросов - негативно".
...
Рейтинг: 0 / 0
14.08.2019, 18:08
    #39849415
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryi,

sp_whoisactive поставить в расписание, скажем, раз в 10 минут
...
Рейтинг: 0 / 0
14.08.2019, 22:30
    #39849520
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryiТак как нагрузка на продуктовый сервер мне не нужна, то, по идее, Profiler не подходит. Так как с кем из админов не поговоришь - все утверждают, что профайлер сильно грузит сервер.

Другой вариант - sp_configure 'blocked process threshold (s)' + Extended Events. Про то, какую нагрузку создаст этот вариант - не в курсе. Кто подскажет? А чё админы сами не настроят мониторинг? Так то это их работа.
XEvents это самый легковесный и точный способ мониторинга блокировок. Немного нагрузки будет только в момент парсинга дурацкого XML. Если там вообще будет что просить.
Запускать же что то каждые 15 минут - бред хотя бы потому, а что если блокировка длилась 3 минуты? Отслеживать так долгие запросы - да, ловить так блокировки я бы не стал.
Профайлер только по блокировкам не намного хуже, но только не сам профайлер, а просто серверный трейс.
...
Рейтинг: 0 / 0
14.08.2019, 22:33
    #39849523
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
alexeyvgЯвно тут дело в блокировке какого то ресурса, типа блокировки схемы, при выделении нового сегмента для колумнстор индекса (не изучал, это на уровне фантазий).Телепат? Это может быть что угодно, включая слетающие периодически планы. Но блокировки конечно надо проверить.
Кстати, совсем забыл. их де можно легко вытащить из логов system health. Даже не настраивая ничего предварительно.
...
Рейтинг: 0 / 0
15.08.2019, 08:57
    #39849583
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сократить максимальное время выполнения запроса?
DaniilSeryi,
Параллельный бэкап базы, в то время как другой процесс вставляет записи в таблицу этой базы - это просто мега-плохая идея!
Вы пробовали потом такой бекап отресторить? Процедура будет идти весьма продолжительно, так как DBE в начале процедуры бекапа работает с базой как в модели FULL, и даже если она SIMPLE - то переключает ее неявно в данный режим, и дописывает все транзакции в журнал, что происходили от точки начала операции резервного копирования и в ее процессе. Если такой бекап потом восстанавливать - то на этапе 100% - DBE начинает накатывать те самые транзакции из журнала что, как сказано выше - может быть весьма долго и затратно.

Если бекапы входят в DR-план, который надо по-хорошему тестировать время от времени - то есть риск не уложиться в RTO
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сократить максимальное время выполнения запроса? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]