SQL Server - Compressão Tabela/Index

SQL Server - Compressão Tabela/Index

Neste post vou passar dois comando utilizados para compressão de Tabela e index no SQL Server. Primeiro iremos a compressão de tabela onde o select abaixo lista as tabela que possuem mais de 10 mil linhas. Pois é neste ponto que podemos dizer que tera um efeito positivo a compressão.

    SELECT DISTINCT 
        [t].[name] AS [Table],
           [p].[data_compression_desc] AS [Compression], 
           [i].[fill_factor],
           'ALTER TABLE [' + [s].[name] + '].[' + [t].[name] + '] REBUILD WITH (DATA_COMPRESSION = PAGE)'
    FROM [sys].[partitions] AS [p]
    INNER JOIN sys.tables AS [t] 
         ON [t].[object_id] = [p].[object_id]
    INNER JOIN sys.indexes AS [i] 
         ON [i].[object_id] = [p].[object_id]
    INNER JOIN sys.schemas AS [s]
       ON [t].[schema_id] = [s].[schema_id]
    WHERE [p].[index_id]  = 0
       AND [p].[rows] > 10000
       AND [p].[data_compression_desc] = 'NONE'

Veja como será o retorno deste comando.

Table             Compression    fill_factor 
----------------- -------------- ----------- ------------------------------------------------------------------------
DPM_DPE_PARTS     NONE           0           ALTER TABLE [dbo].[DPM_DPE_PARTS] REBUILD WITH (DATA_COMPRESSION = PAGE)
TOP_FIELD         NONE           0           ALTER TABLE [dbo].[TOP_FIELD] REBUILD WITH (DATA_COMPRESSION = PAGE)

Note que o comando para realizar a compressão será retornado, é executar o script que a tabela estará comprimida.

Agora iremos realizar a mesma operação de compressão porem a nivel de Index, a logica é a mesma, onde o select irá realizar um filtro em index que possuem mais de 10 mil linhas.

SELECT [t].[name] AS [Table], 
           [i].[name] AS [Index],  
           [p].[partition_number] AS [Partition],
           [p].[data_compression_desc] AS [Compression], 
           [i].[fill_factor],
           [p].[rows],
        'ALTER INDEX [' + [i].[name] + '] ON [' + [s].[name] + '].[' + [t].[name] + 
        '] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE' +
        CASE WHEN [i].[fill_factor] BETWEEN 1 AND 89 THEN ', FILLFACTOR = 90' ELSE '' END + ' )'
    FROM [sys].[partitions] AS [p]
    INNER JOIN sys.tables AS [t] 
         ON [t].[object_id] = [p].[object_id]
    INNER JOIN sys.indexes AS [i] 
         ON [i].[object_id] = [p].[object_id] AND i.index_id = p.index_id
    INNER JOIN sys.schemas AS [s]
       ON [t].[schema_id] = [s].[schema_id]
    WHERE [p].[index_id] > 0
       AND [i].[name] IS NOT NULL
       AND [p].[rows] > 10000
       AND [p].[data_compression_desc] = 'NONE'
    Order by t.name

Retorno da consulta executada.

Table    Index        Partition   Compression  fill_factor rows     
-------- ------------ ----------- ------------ ----------- -------- -----------------------------------------------------------------------------------------------
SB1010   SB10109      1           NONE         0           282502   ALTER INDEX [SB10109] ON [dbo].[SB1010] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE )
SB1010   SB1010A      1           NONE         0           282502   ALTER INDEX [SB1010A] ON [dbo].[SB1010] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE )
SB1010   SB1010B      1           NONE         0           282502   ALTER INDEX [SB1010B] ON [dbo].[SB1010] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE )

Utilizem com moderação

Boa Sorte.