Eu tenho um .txt
arquivo com tamanho de armazenamento de 1253 MB. Após importá-la para o SQL Server 2016, a tabela ocupa 1680 MB em disco. Por que o espaço de armazenamento cresce tanto?
Não fiz nenhuma transformação de dados e usei o char
formato puro para armazenar dados. Eu leio o dicionário de dados do txt
arquivo e se o comprimento de uma variável for no máximo n
, então eu uso varchar(3)
. Se o arquivo tiver comprimento fixo n
, usei char(n)
.
Cerca de 4 a 5 colunas são densamente preenchidas e todas as outras colunas são muito esparsas. Para as colunas esparsas, apenas 1% das linhas não são nulas.
Aqui está o código criando a tabela e importando dados:
CREATE TABLE table1 (
var1 char(12), var2 char(6), var3 varchar(12), var4 varchar(3),
var5 varchar(3), var6 varchar(4), var7 char(1), var8 char(1),
var9 char(2), var10 char(6), var11 varchar(8), var12 varchar(12),
var13 char(6), var14 varchar(12), var15 varchar(14),var16 varchar(12),
var17 varchar(12), var18 varchar(12), var19 varchar(12),var20 varchar(12),
var21 varchar(12), var22 varchar(12));
Como posso reduzir o espaço de armazenamento?
Aqui estão as informações de armazenamento do comando sp_spaced
:
tabela de nomes1 linhas 22260960 reservado 1721240 KB dados 1721128 KB index_size 24 KB 88 KB não utilizados
Há uma sobrecarga de armazenamento de metadados para colunas no SQL Server que você não precisa pagar em um arquivo simples. O uso da compactação pode reduzir essa sobrecarga. Da implementação da compactação de linha :
Tente compactar sua tabela com compactação de linha ou página e veja se isso reduz o espaço necessário no SQL Server.
Na minha experiência, a compactação pode melhorar e degradar o desempenho da consulta. Depende dos dados e da consulta que você está executando. É possível que você precise fazer uma troca entre o espaço e o desempenho da consulta.
Outra opção a explorar é usar
SPARSE
colunas. Consulte Usar colunas esparsas na documentação. Observe, porém, que colunas esparsas são incompatíveis com compactação de dados (e columnstore).Além da opção de compactação de linha e página mencionada na resposta de Joe Obbish , no SQL Server 2016, você pode usar o armazenamento columnstore clusterizado . Isso normalmente reduzirá o armazenamento ainda mais do que a compactação de página, especialmente se a compactação de arquivo for usada.
Consulte Columnstore Indexes Guide e Usando Columnstore e compactação de arquivo Columnstore na documentação.
Quantos registros são importados? Deve ser relativamente simples determinar quanto armazenamento é necessário. Cada
char(n)
requern
bytes e cadavarchar(n)
requer (2 + o comprimento real dos dados inseridos) bytes.Consulte char e varchar (Transact-SQL) na documentação do produto.