AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 5455
Accepted
Jon of All Trades
Jon of All Trades
Asked: 2011-09-07 12:43:45 +0800 CST2011-09-07 12:43:45 +0800 CST 2011-09-07 12:43:45 +0800 CST

Por que o espaço de dados de uma tabela pode ocupar 4x o tamanho dos dados brutos?

  • 772

Eu tenho uma tabela com 490 M de linhas e 55 GB de espaço de tabela, ou seja, cerca de 167 bytes por linha. A tabela tem três colunas: a VARCHAR(100), a DATETIME2(0)e a SMALLINT. O comprimento médio do texto no VARCHARcampo é 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 DATETIME2e 2 para o inteiro de 16 bits.

Observe que o espaço acima é apenas para dados, não para índices. Estou usando o valor informado em Propriedades | Armazenamento | Geral | Espaço de dados.

Claro que deve haver alguma sobrecarga, mas 135 bytes por linha parece muito, especialmente para uma tabela grande. Por que isso pode ser? Alguém mais viu multiplicadores semelhantes? Que fatores podem influenciar a quantidade de espaço extra necessária?

Para comparação, tentei criar uma tabela com dois INTcampos e 1 milhão de linhas. O espaço de dados necessário foi de 16,4 MB: 17 bytes por linha, em comparação com 8 bytes de dados brutos. Outra tabela de teste com um INTe um VARCHAR(100)preenchida com o mesmo texto da tabela real usa 39 bytes por linha (44 K linhas), onde eu esperaria 28 mais um pouco.

Portanto, a tabela de produção tem consideravelmente mais sobrecarga. É porque é maior? Eu esperaria 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 não é linear.

Agradecemos antecipadamente por quaisquer ponteiros!

EDITAR:

Todos os campos listados são NOT NULL. A tabela real tem um PK agrupado no VARCHARcampo e no DATETIME2campo, nessa ordem. Para os dois testes, o primeiro INTfoi o PK (agrupado).

Se for importante: 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 reduzi-los a 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 de gravação for mais importante, pode ser melhor usar índices flácidos.

sql-server-2008 disk-space
  • 3 3 respostas
  • 7357 Views

3 respostas

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-09-08T13:20:45+08:002011-09-08T13:20:45+08:00

    Após discussões nos comentários sobre a pergunta original, parece que, neste caso, o espaço perdido é causado pela escolha da chave agrupada, que levou a uma fragmentação massiva.

    Sempre vale a pena verificar o estado de fragmentação via sys.dm_db_index_physical_stats nessas situações.

    Edit: Seguindo a atualização nos comentários

    A densidade média da página (antes da reconstrução do índice agrupado) foi de 24%, o que se encaixa perfeitamente com a pergunta original. As páginas estavam apenas 1/4 cheias, então o tamanho total era 4x o tamanho dos dados brutos.

    • 11
  2. gbn
    2011-09-07T21:02:54+08:002011-09-07T21:02:54+08:00

    As estruturas em disco têm sobrecarga:

    • cabeçalho de linha
    • bitmap nulo + ponteiro
    • deslocamentos de coluna de comprimento variável
    • ponteiros de versão de linha (opcional)
    • ...

    Pegando colunas int de 2 x 4 bytes, você tem

    • cabeçalho de linha de 4 bytes
    • ponteiro de 2 bytes para bitmap NULL
    • 8 bytes para 2 colunas int
    • bitmap NULO de 3 bytes

    Uau 17 bytes!

    Você pode fazer o mesmo para sua segunda tabela de teste, que tem mais sobrecarga como a original:

    • 2 bytes para a contagem de colunas de comprimento variável
    • 2 bytes por coluna de comprimento variável

    Por que a diferença? Além disso (não vou vincular a estes)

    • você já reconstruiu índices para desfragmentá-los?
    • exclusões não recuperam espaço
    • as páginas de dados serão divididas se você inserir no meio
    • atualizações podem causar ponteiros de avanço (deixa uma lacuna)
    • estouro de linha
    • coluna varchar removida sem reconstrução de índice ou DBCC CLEANTABLE
    • heap ou tabela (heap não tem índice clusterizado = registros espalhados por toda parte)
    • Nível de isolamento RCSI (extra 14 bytes por linha)
    • espaços à direita (SET ANSI_PADDING é ON por padrão) em varchar. Use DATALENGTH para verificar, não LEN
    • Execute sp_spaceused com@updateusage = 'true'
    • ...

    Veja isto: SQL Server: Como criar uma tabela que ocupa uma página de 8 KB?

    De SO:

    • https://stackoverflow.com/questions/4614771/sql-server-2008-how-much-space-does-this-occupy/4614799#4614799
    • https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265
    • 7
  3. Aaron Bertrand
    2011-09-07T13:08:41+08:002011-09-07T13:08:41+08:00

    Os tipos de dados mudaram ao longo do tempo? As colunas de comprimento variável foram removidas? Os índices foram desfragmentados com frequência, mas nunca reconstruídos? Muitas linhas foram excluídas ou muitas colunas de comprimento variável foram atualizadas significativamente?

    • 5

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve