[SQL SERVER] Compression table estimation espace
CREATE OR ALTER FUNCTION dbo.generate_index_ddl
(
 @object_id INT,
 @index_id INT,
 @data_compression NVARCHAR(60) = NULL,
 @sample_table SYSNAME,
 @sample_index SYSNAME,
 @desired_compression NVARCHAR(60) = NULL,
 @xml_compression NVARCHAR(60) = NULL
)
RETURNS TABLE
AS
RETURN
(
 WITH index_info AS (
 SELECT
 s.name AS schema_name,
 o.name AS table_name,
 i.name AS index_name,
 i.is_primary_key,
 i.is_unique,
 i.type_desc,
 i.filter_definition,
 i.fill_factor,
 i.allow_row_locks,
 i.allow_page_locks,
 i.is_padded,
 i.ignore_dup_key,
 i.data_space_id
 FROM sys.indexes AS i
 JOIN sys.objects AS o ON i.object_id = o.object_id
 JOIN sys.schemas AS s ON o.schema_id = s.schema_id
 WHERE i.object_id = @object_id AND i.index_id = @index_id
 ),
 cols AS (
 SELECT 
 ic.object_id, 
 ic.index_id, 
 ic.is_included_column,
 c.name AS colname,
 ic.is_descending_key,
 ic.key_ordinal
 FROM sys.index_columns ic
 JOIN sys.columns c 
 ON c.object_id = ic.object_id AND c.column_id = ic.column_id
 WHERE ic.object_id = @object_id AND ic.index_id = @index_id
 ),
 key_cols AS (
 SELECT STRING_AGG(QUOTENAME(colname) + CASE is_descending_key WHEN 1 THEN ' DESC' ELSE ' ASC' END, ', ') AS key_cols
 FROM cols WHERE is_included_column = 0
 ),
 include_cols AS (
 SELECT STRING_AGG(QUOTENAME(colname), ', ') AS include_cols
 FROM cols WHERE is_included_column = 1
 ),
 ds AS (
 SELECT name AS filegroup_name FROM sys.data_spaces ds
 JOIN index_info i ON ds.data_space_id = i.data_space_id
 )
 SELECT
 -- Drop scripts
 N'IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N''' + @sample_index + ''' AND object_id = OBJECT_ID(N''' + @sample_table + ''')) ' +
 N'DROP INDEX ' + QUOTENAME(@sample_index) + N' ON ' + @sample_table AS drop_current_index_ddl,
N'IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N''' + @sample_index + '_desired'' AND object_id = OBJECT_ID(N''' + @sample_table + ''')) ' +
 N'DROP INDEX ' + QUOTENAME(@sample_index + '_desired') + N' ON ' + @sample_table AS drop_desired_index_ddl,
-- Create scripts (current)
 N'CREATE ' +
 CASE WHEN i.is_unique = 1 THEN N'UNIQUE ' ELSE N'' END +
 i.type_desc + N' INDEX ' + QUOTENAME(@sample_index) +
 N' ON ' + @sample_table +
 N' (' + kc.key_cols + N')' +
 CASE WHEN ic.include_cols IS NOT NULL THEN N' INCLUDE (' + ic.include_cols + N')' ELSE N'' END +
 CASE WHEN i.filter_definition IS NOT NULL THEN N' WHERE ' + i.filter_definition ELSE N'' END +
 N' WITH (DATA_COMPRESSION = ' + ISNULL(@data_compression, 'NONE') + N')' +
 N' ON ' + QUOTENAME(ds.filegroup_name) AS create_current_index_ddl,
--Create scripts (desired compression)
 N'CREATE ' +
 CASE WHEN i.is_unique = 1 THEN N'UNIQUE ' ELSE N'' END +
 i.type_desc + N' INDEX ' + QUOTENAME(@sample_index + '_desired') +
 N' ON ' + @sample_table +
 N' (' + kc.key_cols + N')' +
 CASE WHEN ic.include_cols IS NOT NULL THEN N' INCLUDE (' + ic.include_cols + N')' ELSE N'' END +
 CASE WHEN i.filter_definition IS NOT NULL THEN N' WHERE ' + i.filter_definition ELSE N'' END +
 N' WITH (DATA_COMPRESSION = ' + ISNULL(@desired_compression, 'NONE') + N')' +
 N' ON ' + QUOTENAME(ds.filegroup_name) AS create_desired_index_ddl,
--Compression commands
 N'ALTER INDEX ' + QUOTENAME(@sample_index) + N' ON ' + @sample_table +
 N' REBUILD WITH (DATA_COMPRESSION = ' + ISNULL(@data_compression, 'NONE') + N')' AS compress_current_ddl,
N'ALTER INDEX ' + QUOTENAME(@sample_index + '_desired') + N' ON ' + @sample_table +
 N' REBUILD WITH (DATA_COMPRESSION = ' + ISNULL(@desired_compression, 'NONE') + N')' AS compress_desired_ddl,
i.is_primary_key AS is_primary
FROM index_info i
 CROSS JOIN key_cols kc
 CROSS JOIN include_cols ic
 CROSS JOIN ds
)
