Estou tentando compactar algumas tabelas que possuem NVARCHAR(MAX)
campos. Infelizmente, o row
e a page
compactação não têm o impacto desejado (apenas ~ 100/200 MB salvos para a tabela de 20 GB). Além disso, não consigo aplicar armazenamento de coluna e compactações de arquivamento de armazenamento de coluna porque eles não oferecem suporte à compactação de NVARCHAR(MAX)
campos.
Alguém pode dizer se eu tenho alguma alternativa aqui?
Eu também acho que a compressão row
e page
não tem efeito porque o conteúdo das NVARCHAR(MAX)
colunas é único.
Tanto a compactação de página quanto a de linha não compactam BLOBs .
Se você deseja compactar BLOBs, precisa armazená-los
VARBINARY(MAX)
e aplicar o algoritmo de compactação de fluxo de sua escolha. Por exemploGZipStream
. Existem muitos exemplos de como fazer isso, basta procurar por GZipStream e SQLCLR.Existem (agora) potencialmente duas maneiras de realizar a compactação personalizada:
A partir do SQL Server 2016, existem funções internas para COMPRESS e DECOMPRESS . Essas funções usam o algoritmo GZip.
Use SQLCLR para implementar qualquer algoritmo que você escolher (como @Remus mencionou em sua resposta). Essa opção está disponível em versões anteriores ao SQL Server 2016, desde o SQL Server 2005.
GZip é uma escolha fácil porque está disponível no .NET e nas bibliotecas suportadas do .NET Framework (o código pode estar em um
SAFE
Assembly). Ou, se você deseja o GZip, mas não quer lidar com a codificação/implantação, pode usar as funções Util_GZip e Util_GUnzip que estão disponíveis na versão gratuita da biblioteca SQL# SQLCLR (da qual sou o autor).Se você decidir usar o GZip, seja você mesmo quem o codifica ou use o SQL#, saiba que o algoritmo usado no .NET para fazer a compactação do GZip mudou para melhor no Framework versão 4.5 (consulte a seção "Comentários" no MSDN página para GZipStream Class ). Isso significa:
No entanto, você não precisa usar o GZip e é livre para implementar qualquer algoritmo semelhante.
OBSERVE: todos os métodos mencionados acima são mais "soluções alternativas" em vez de substituições reais, mesmo que sejam tecnicamente "maneiras alternativas de compactar dados NVARCHAR(MAX)". A diferença é que com a compactação de dados incorporada --
row
epage
-- oferecida pelo SQL Server, a compactação é feita nos bastidores e os dados ainda podem ser usados, lidos e indexados. Mas compactar todos os dados em umVARBINARY
significa que você está economizando espaço, mas abrindo mão de algumas funcionalidades. É verdade que uma string de 20k não é indexável de qualquer maneira, mas ainda pode ser usada em umWHERE
cláusula ou com qualquer função de string. Para fazer qualquer coisa com um valor compactado personalizado, você precisaria descompactá-lo na hora. Ao compactar arquivos binários (PDFs, JPEGs, etc.), isso não é um problema, mas essa questão era específica paraNVARCHAR
dados.