quinta-feira, 1 de setembro de 2016

Novas funções de compressão de dados no SQL Server 2016



Vou iniciar uma série de posts sobre as novas funcionalidades do SQL Server 2016, começando pelas funções de compactação de dados. 

As versões anteriores do SQL Server já traziam opções de compactação de página e linha, habilitadas com CREATE ou ALTER TABLE.

As funções COMPRESS e DECOMPRESS podem ser utilizadas nos comandos INSERT, UPDATE, SELECT para compactar e descompactar coluna por coluna.  O algoritmo utilizado é o GZip (https://en.wikipedia.org/wiki/Gzip), a aplicação pode utilizar o GZip para compactar e enviar para o SQL Server ou então utilizar as funções para compactar direto no T-SQL.

Exemplo

DROP TABLE IF EXISTS Products

CREATE TABLE Products (
 ProductID int,
 Name nvarchar(50),
 ProductModel nvarchar(50),
 Description nvarchar(400),
 Description_COMP varbinary(max))
go

INSERT INTO Products (ProductID,Name,ProductModel,Description,Description_COMP)
select ProductID,Name,ProductModel,Description,COMPRESS(Description) as Description_COMP
from AdventureWorks.Production.vProductAndDescription

SELECT ProductID,Name,ProductModel,Description,
CAST(DECOMPRESS(Description_COMP) AS NVARCHAR(400)) AS Description_COMP
FROM Products



Além das funções COMPRESS e DECOMPRESS o script acima utiliza outra novidade no SQL Server 2016, o DROP ... IF EXISTS, que pode ser utilizado em: AGGREGATE, PROCEDURE, TABLE, ASSEMBLY, TRIGGER, VIEW, TYPE, DATABASE, SCHEMA, USER, DEFAULT, VIEW, FUNCTION, SEQUENCE, INDEX e SYNONYM.

A função COMPRESS retorna VARBINARY, por isso foi utilizada no CREATE TABLE VARBINARY(MAX) na coluna Description_COMP.

Como a função DECOMPRESS também retorna VARBINARY, foi utilizada no último SELECT a função CAST para converter para o tipo de dado original da coluna.

SELECT ProductID,Name,Description,
DATALENGTH(Description) as Tamanho_SemCOMP,
DATALENGTH(Description_COMP) AS Tamanho_COMP
FROM Products



No script acima utilizei a função DATALENGTH, que retorna a quantidade de bytes de uma expressão, para analisar a eficiência da compactação.  Veja que na primeira linha, por ser uma string pequena, a coluna compactada ficou até maior que a original, mas nas demais linhas apresentou ganho.

Até o próximo post.

Saudações Tricolores,
Landry

Nenhum comentário: