Скрипт сжатия всех баз MS SQL
Скрипт обходит все пользовательские базы и сжимает их.
Данный скрипт является SQL-запросом и содержит несколько действий, которые выполняются для каждой базы данных в текущем экземпляре SQL Server.
Использует каждую базу данных одну за другой.
Если база данных не является одной из системных баз данных (master, model, msdb, tempdb), то он продолжает выполнять скрипт.
Находит таблицы в базе данных, у которых не применена сжатие данных.
Создает временную таблицу #tmpTables для хранения имён таблиц без сжатия данных.
В цикле while выбирает имя таблицы из #tmpTables и выполняет операции перестроения таблицы и индексов на этой таблице с использованием сжатия страниц данных. Затем удаляет эту таблицу из временной таблицы.
Проверяет, были ли внесены изменения в базу данных. Если да, то выполняет операцию сжатия базы данных с помощью команды DBCC SHRINKDATABASE.
Удаляет временную таблицу и возвращает имя текущей базы данных.
Таким образом, данный скрипт выполняет сжатие данных таблиц и индексов для всех таблиц в каждой базе данных в экземпляре SQL Server, если они еще не сжаты. Он также сжимает базу данных, если были внесены изменения.
EXEC sp_MSforeachdb 'USE ?
IF NOT (''?'' = ''master'' OR ''?'' = ''model'' OR ''?'' = ''msdb'' OR ''?'' = ''tempdb'')
BEGIN
SELECT DISTINCT
[tables].name AS TName
INTO #tmpTables
FROM sys.tables [tables]
LEFT JOIN sys.indexes [indexes]
ON [tables].object_id = [indexes].object_id
LEFT JOIN sys.partitions p
ON [indexes].index_id = p.index_id
AND [tables].object_id = p.object_id
WHERE p.data_compression_desc = ''NONE''
DECLARE @TName nvarchar(2000)
DECLARE @DBModifyed int
SET @DBModifyed = 0
SELECT TOP 1 @TName = TName FROM #tmpTables
WHILE @@ROWCOUNT != 0
BEGIN
EXEC (''ALTER TABLE '' + @TName + '' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)'')
EXEC (''ALTER INDEX ALL ON '' + @TName + '' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)'')
DELETE #tmpTables WHERE TName = @TName
SET @DBModifyed = 1
SELECT TOP 1 @TName = TName FROM #tmpTables
END
IF @DBModifyed = 1
BEGIN
DBCC SHRINKDATABASE(N''?'', 0)
END
DROP TABLE #tmpTables
SELECT ''?''
END'