以前、SQL Server のデータ圧縮のサイズ見積もりを複数テーブルを対象に実施 という投稿をしたことがありました。
サイズ見積りだけでなく、実際の圧縮も一括で実行できると便利だなと思い書いてみました。
# 対象データベースの全インデックスを再構築する SQL とほとんど同じですね。
以下のような SQL を実行することでベーステーブルに対して圧縮をすることができます。
USE DataCollection GO DECLARE @TableName sysname DECLARE @SchemaName sysname DECLARE @basesql nvarchar(max), @sql nvarchar(max) SET @basesql = 'ALTER TABLE @1 REBUILD WITH (ONLINE=ON, DATA_COMPRESSION=PAGE)' DECLARE TBLC CURSOR FOR SELECT OBJECT_NAME(object_id) AS TableName , OBJECT_SCHEMA_NAME (object_id) AS SchemaName FROM sys.objects WHERE OBJECT_SCHEMA_NAME (object_id) <> 'sys' AND type = 'U' ORDER BY 2,1 OPEN TBLC FETCH NEXT FROM TBLC INTO @TableName, @SchemaName WHILE @@FETCH_STATUS = 0 BEGIN PRINT @SchemaName + '.' + @TableName SET @sql = REPLACE(@basesql, '@1', @SchemaName + '.' + @TableName) EXECUTE (@sql) FETCH NEXT FROM TBLC INTO @TableName, @SchemaName END CLOSE TBLC DEALLOCATE TBLC
圧縮中はデータファイルやログファイルが使用されたかと思いますので、一括で実行する場合にはデータベースのファイルサイズには注意しておいたほうがいいかもしれないですね。