Eu tenho uma tabela com 490 M linhas e 55 GB de espaço de tabela, portanto, cerca de 167 bytes por linha. A tabela possui três colunas: a VARCHAR(100)
, a DATETIME2(0)
e a SMALLINT
. O comprimento médio do texto no VARCHAR
campo é de cerca de 21,5, portanto, os dados brutos devem ter cerca de 32 bytes por linha: 22 + 2 para o VARCHAR
, 6 para o DATETIME2
e 2 para o inteiro de 16 bits.
Observe que o espaço acima é apenas para dados, não para índices. Estou usando o valor relatado em Propriedades | Armazenamento | Geral Espaço de dados.
É claro que deve haver alguma sobrecarga, mas 135 bytes por linha parecem muito, especialmente para uma tabela grande. Por que isso pode ser? Alguém mais viu multiplicadores semelhantes? Quais fatores podem influenciar a quantidade de espaço extra necessária?
Para comparação, tentei criar uma tabela com dois INT
campos e 1 milhão de linhas. O espaço de dados necessário era 16,4 MB: 17 bytes por linha, em comparação com 8 bytes de dados brutos. Outra tabela de teste com um INT
e um VARCHAR(100)
preenchido com o mesmo texto que a tabela real usa 39 bytes por linha (44 K linhas), onde eu esperaria 28 mais um pouco.
Portanto, a tabela de produção possui consideravelmente mais despesas gerais. Isso é porque é maior? Eu esperava que os tamanhos dos índices fossem aproximadamente N * log (N), mas não vejo por que o espaço necessário para os dados reais serem não lineares.
Agradecemos antecipadamente por quaisquer ponteiros!
EDITAR:
Todos os campos listados são NOT NULL
. A tabela real possui uma PK em cluster no VARCHAR
campo e no DATETIME2
campo, nessa ordem. Para os dois testes, o primeiro INT
foi o PK (agrupado).
Se isso importa: a tabela é um registro dos resultados do ping. Os campos são URL, data / hora do ping e latência em milissegundos. Os dados são constantemente anexados e nunca atualizados, mas os dados são excluídos periodicamente para reduzir para apenas alguns registros por hora por URL.
EDITAR:
Uma resposta muito interessante aqui sugere que, para um índice com muita leitura e escrita, a reconstrução pode não ser benéfica. No meu caso, o espaço consumido é uma preocupação, mas se o desempenho da gravação for mais importante, é possível melhorar os índices flácidos.
fonte
VARCHAR
s na minha estimativa acima, mas não pela contagem de colunas. Esta tabela não possui campos NULLable (deveria ter mencionado isso), ainda aloca bytes para eles?Os tipos de dados foram alterados ao longo do tempo? As colunas de comprimento variável foram removidas? Os índices foram desfragmentados com frequência, mas nunca foram reconstruídos? Muitas linhas foram excluídas ou muitas colunas de comprimento variável foram atualizadas significativamente? Alguma boa discussão aqui .
fonte
VARCHAR
eDATETIME2
, nessa ordem. As inserções serão distribuídas igualmente para o primeiro campo. Para o segundo campo, novos valores e sempre serão maiores que os existentes.