MS SQL
May 11, 2023

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