Скрипт сжатия всех баз 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'