SQL
Microsoft SQL Server
Comments 28
+9
Я могу написать, как я чистил логи за 5 лет (которые я бережно переносил с каждым бекапом).
+1
А я правильно понял, что в БД накопилось 42Гб транзакций которых почему-то никто не удалял, но постоянно сканировал линейным методом? Если это не так, то что тормозило тогда?
+1
Возможно ключ к разгадке как раз CDC который не успевал применятся на таблицы с изменениями, отчего и копилась очередь.
+2
Вот и бекап пригодился…

В общем ситуация была следующей: CDC выполнялась по расписанию и внутри обращалась к sys.transmission_queue, который в свою очередь смотрел на sys.sysxmitqueu. На плане можете увидеть, что делался Index Seek огромное число раз и именно по этому убивался диск и ЦП при выполнении:



План я взял из dbForge исключительно из-за наглядности, поскольку в SSMS надписи на «стрелками» нет.
0
Нет, если говорить про момент, когда я анализировал проблему. Первоначально были планы ее обновить. Но потом принял решение почистить таблицу описанные выше способом.
0
И забыл добавить… почему не обновил статистику. Поскольку объект системный его напрямую нельзя трогать и такая вот команда выполняться не будет:

UPDATE STATISTICS sys.sysxmitqueu WITH FULLSCAN

Msg 2706, Level 16, State 6, Line 1
Table 'sysxmitqueu' does not exist.

0
Простите за оффтопик, но очень уж два вопроса мучают последние эн лет. Может, они еще кого-то тоже мучают.

Почему в mssql вместо ansi sql кавычек используются квадратные скобки, а вместо точки с запятой — слово GO? Есть этому какое-то объяснение?
+3
Можно и кавычки. Но это на один Shift больше.
А точка с запятой необходима, если будете пользоваться with()select — там перед with она необходима. Соответственно, если б была разделителем, никто б не смог создать процедуру с этой конструкцией. Из-за чего невозможно пользоваться плагином к Eclipse. Ну и вообще интересно, где это такое в стандарте. Насколько помню, там точка с запятой ставится после команды и mssql именно так и ведёт себя. А вот пакеты разделяются GO и это не стандарт языка, а формат для Management Studio.
А вообще всё это по историческим причинам.
+1
Так при использовании CTE точка с запятой и отделяет with от предыдущей команды, чтобы было отличие от табличных хинтов.
+1
Квадратные скобки удобнее в языках программирования, например в 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
0
Кто то может подсказать как зачистить
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
Я спрашиваю, нет вообще опыта и понимания что может MS удумать…
Сейчас запустим. Делаю пока резерв.
0
Я лишь вижу, что команда отработала успешно. К тому же сервер бы не мешало обновить. Уже есть SP4, а вы все на RTM сидите.
0
Обновить да… ;( Но меня смутило «строк 0» и время 00:00:00
0
Можно попробовать в следующий раз написать более медленный вариант скрипта по удалению :) но суть не поменяется. А вообще-то советую свежие обновления на машину поставить и посмотреть что и как можно сконфигурировать, чтобы все быстрее шевелилось. Например, за счет Instant File Initialization.
0
Таблицу удалило. С топ 10 она пропала. Но на размер базы в общем не повлияло. Как было 30 с гаком так и осталось.
0
Так сделайте усечение файла данных. SQL Server за Вас это не будет делать (если конечно одна плохая настройка не включена по дефолту). Почитайте как сделать Shrink Flies.
Only those users with full accounts are able to leave comments., please.