Комментарии 28
Как же не хватает таких статей!
+9
А я правильно понял, что в БД накопилось 42Гб транзакций которых почему-то никто не удалял, но постоянно сканировал линейным методом? Если это не так, то что тормозило тогда?
+1
Возможно ключ к разгадке как раз CDC который не успевал применятся на таблицы с изменениями, отчего и копилась очередь.
+1
Вот и бекап пригодился…
В общем ситуация была следующей: CDC выполнялась по расписанию и внутри обращалась к sys.transmission_queue, который в свою очередь смотрел на sys.sysxmitqueu. На плане можете увидеть, что делался Index Seek огромное число раз и именно по этому убивался диск и ЦП при выполнении:
План я взял из dbForge исключительно из-за наглядности, поскольку в SSMS надписи на «стрелками» нет.
В общем ситуация была следующей: CDC выполнялась по расписанию и внутри обращалась к sys.transmission_queue, который в свою очередь смотрел на sys.sysxmitqueu. На плане можете увидеть, что делался Index Seek огромное число раз и именно по этому убивался диск и ЦП при выполнении:
План я взял из dbForge исключительно из-за наглядности, поскольку в SSMS надписи на «стрелками» нет.
+2
а статистика верная на sys.sysxmitqueu?
0
Нет, если говорить про момент, когда я анализировал проблему. Первоначально были планы ее обновить. Но потом принял решение почистить таблицу описанные выше способом.
0
Простите за оффтопик, но очень уж два вопроса мучают последние эн лет. Может, они еще кого-то тоже мучают.
Почему в mssql вместо ansi sql кавычек используются квадратные скобки, а вместо точки с запятой — слово GO? Есть этому какое-то объяснение?
Почему в mssql вместо ansi sql кавычек используются квадратные скобки, а вместо точки с запятой — слово GO? Есть этому какое-то объяснение?
0
Можно и кавычки. Но это на один Shift больше.
А точка с запятой необходима, если будете пользоваться with()select — там перед with она необходима. Соответственно, если б была разделителем, никто б не смог создать процедуру с этой конструкцией. Из-за чего невозможно пользоваться плагином к Eclipse. Ну и вообще интересно, где это такое в стандарте. Насколько помню, там точка с запятой ставится после команды и mssql именно так и ведёт себя. А вот пакеты разделяются GO и это не стандарт языка, а формат для Management Studio.
А вообще всё это по историческим причинам.
А точка с запятой необходима, если будете пользоваться with()select — там перед with она необходима. Соответственно, если б была разделителем, никто б не смог создать процедуру с этой конструкцией. Из-за чего невозможно пользоваться плагином к Eclipse. Ну и вообще интересно, где это такое в стандарте. Насколько помню, там точка с запятой ставится после команды и mssql именно так и ведёт себя. А вот пакеты разделяются GO и это не стандарт языка, а формат для Management Studio.
А вообще всё это по историческим причинам.
+3
Квадратные скобки удобнее в языках программирования, например в C#:
"SELECT [Name]"
вместо @"SELECT ""Name"""
.+1
точка с запятой так же может разделять стейтменты внутри блока. GO совершенно не замена её.
+1
Да, у нас msdb тоже сильно растет из-за резервного копирования 300-500 маленьких баз.
Но на этот случай вы как раз можете создать визардом план обслуживания типа «Очистка журнала», включающий очистку
msdb.dbo.sp_delete_backuphistory
msdb.dbo.sp_purge_jobhistory
msdb..sp_maintplan_delete_log
Но на этот случай вы как раз можете создать визардом план обслуживания типа «Очистка журнала», включающий очистку
msdb.dbo.sp_delete_backuphistory
msdb.dbo.sp_purge_jobhistory
msdb..sp_maintplan_delete_log
+1
Кто то может подсказать как зачистить
dbo.sysmaintplan_logdetail, у меня 33 гигабайт в этой таблице, встроеные зачистки и сжатия результата не дают…
dbo.sysmaintplan_logdetail, у меня 33 гигабайт в этой таблице, встроеные зачистки и сжатия результата не дают…
0
Такой вариант не помог?
USE msdb
GO
ALTER TABLE dbo.sysmaintplan_log
DROP CONSTRAINT FK_sysmaintplan_log_subplan_id
ALTER TABLE dbo.sysmaintplan_logdetail
DROP CONSTRAINT FK_sysmaintplan_log_detail_task_id
GO
TRUNCATE TABLE msdb.dbo.sysmaintplan_logdetail
TRUNCATE TABLE msdb.dbo.sysmaintplan_log
GO
ALTER TABLE dbo.sysmaintplan_log WITH CHECK
ADD CONSTRAINT FK_sysmaintplan_log_subplan_id
FOREIGN KEY(subplan_id)
REFERENCES dbo.sysmaintplan_subplans (subplan_id)
GO
ALTER TABLE dbo.sysmaintplan_logdetail WITH CHECK
ADD CONSTRAINT FK_sysmaintplan_log_detail_task_id
FOREIGN KEY(task_detail_id)
REFERENCES dbo.sysmaintplan_log (task_detail_id) ON DELETE CASCADE
GO
0
Еще не пробовал. Сейчас попробую, насколько опасно на ходу делать (базы юзают вов всю)?
0
А что опасного? Если нет никаких блокировок на изменению схемы, то все нормально сможеть выполниться. Решите для себя нужны ли Вам эти данные. В них хранится история запуска планов обслуживания, насколько я помню. Что такое сжатие в Вашем понимании? Есть на уровне ROW, PAGE и отдельный фетиш — ColumnStore (начиная с 2014го).
0
Что то не так.
0
Я лишь вижу, что команда отработала успешно. К тому же сервер бы не мешало обновить. Уже есть SP4, а вы все на RTM сидите.
0
Обновить да… ;( Но меня смутило «строк 0» и время 00:00:00
0
Можно попробовать в следующий раз написать более медленный вариант скрипта по удалению :) но суть не поменяется. А вообще-то советую свежие обновления на машину поставить и посмотреть что и как можно сконфигурировать, чтобы все быстрее шевелилось. Например, за счет Instant File Initialization.
0
Таблицу удалило. С топ 10 она пропала. Но на размер базы в общем не повлияло. Как было 30 с гаком так и осталось.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
История про msdb размером в 42 Гб