Compress all Tables and Indexes
Applicability:
SQL Server 2000: Not Supported
SQL Server 2005: Not Supported
SQL Server 2008: Tested
SQL Server 2008R2: Tested
SQL Server 2012: Not Tested
Credits:
Author: Unknown
Date: 20 Feb 2010
Description
Data compression (at the row and page level) was a feature introduced in sQL Server 2008.
There are limitations as to which objects that compression can be implied and it is best to look these up in SQL BOL.
Compression can be applied to an individual table, but the non-clustered indexes for the table must be compressed separately. Compression can be achieved via TSQL, but this can get a bit verbose where there are multiple indexes per table.
The scripts below will generate TSQL compression activation code for all or some of the tables and indexes in a database.
They are provided in a form that will include all tables or indexes, but they can be easily customised by uncommenting and changing the provided 'AND' clauses.
Code
Compress Tables:
--Creates the ALTER TABLE Statements
SET NOCOUNT ON
SELECT
'ALTER TABLE ['
+ s.[name]
+ '].['
+ o.[name]
+ '] REBUILD WITH (DATA_COMPRESSION=PAGE);'
FROM sys.objects AS o WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON o.[object_id] = i.[object_id]
INNER JOIN sys.schemas AS s WITH (NOLOCK)
ON o.[schema_id] = s.[schema_id]
INNER JOIN sys.dm_db_partition_stats AS ps WITH (NOLOCK)
ON i.[object_id] = ps.[object_id]
AND ps.[index_id] = i.[index_id]
WHERE o.[type] = 'U'
--AND s.Name LIKE '%%' -- filter by table name
--AND o.Name LIKE '%%' -- filter by schema name
ORDER BY ps.[reserved_page_count]
SET NOCOUNT OFF
Compress Indexes:
--Creates the ALTER INDEX Statements
SET NOCOUNT ON
SELECT
'ALTER INDEX ['
+ i.[name]
+ '] ON ['
+ s.[name]
+ '].['
+ o.[name]
+ '] REBUILD WITH (DATA_COMPRESSION=PAGE);'
FROM sys.objects AS o WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON o.[object_id] = i.[object_id]
INNER JOIN sys.schemas s WITH (NOLOCK)
ON o.[schema_id] = s.[schema_id]
INNER JOIN sys.dm_db_partition_stats AS ps WITH (NOLOCK)
ON i.[object_id] = ps.[object_id]
AND ps.[index_id] = i.[index_id]
WHERE o.type = 'U'
AND i.[index_id] >0
--AND i.Name LIKE '%%' -- filter by index name
--AND o.Name LIKE '%%' -- filter by table name
ORDER BY ps.[reserved_page_count]
SET NOCOUNT OFF