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 / 312507
Accepted
Aleksey Vitsko
Aleksey Vitsko
Asked: 2022-05-25 02:58:40 +0800 CST2022-05-25 02:58:40 +0800 CST 2022-05-25 02:58:40 +0800 CST

Espaço de armazenamento usado para valores NULL

  • 772

De acordo com os links abaixo, NULLos valores ocupam algum espaço de armazenamento:

https://stackoverflow.com/questions/3731172/how-much-size-null-value-takes-in-sql-server
https://www.sqlservercentral.com/forums/topic/null-storage-2

Se a coluna tiver o tipo de dados de largura fixa - NULLocupa o comprimento da coluna

char(10) NULL takes 10 bytes
INT NULL takes 4 bytes

Se a coluna tiver largura variável - NULLleva 0 bytes

varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)

Além disso, há uma sobrecarga por ter uma coluna anulável. As informações nos links são um pouco contraditórias.
Alguém pode dar uma luz sobre isso?

Aqui estão minhas perguntas:

  1. Algumas pessoas dizem que a sobrecarga por ter uma coluna anulável é de 1 bit por linha, outras que é de 1 byte por linha
    . Qual é verdade? Eu suponho que seja 1 bit por linha (portanto, 8 linhas fazem 1 byte), estou certo?

  2. Para valores NULL em varchar, ainda há uma sobrecarga de 2 bytes por linha - é realmente verdade?

  3. Pergunta mais importante:
    eu tenho uma tabela com ~ 250 milhões de linhas de dados, o tamanho total é ~ 115 GB
    Eu adicionei 7 colunas usando o código abaixo, verificando o tamanho da tabela usando sp_spaceused após cada comando

colunas adicionadas:

alter table MyTable add TestVarchar10 varchar(10) NULL      
alter table MyTable add TestVarchar1000 varchar(1000) NULL  
alter table MyTable add TestVarchar10DefaultTest varchar(10) NULL default 'test'        
alter table MyTable add TestVarchar10DefaultTestWithValues varchar(10) NULL default 'test' with values  

alter table MyTable add TestINT int NULL
alter table MyTable add TestINTDefault99 int NULL default 99
alter table MyTable add TestINTDefault99WithValues int NULL default 99 with values

E qualquer uma das colunas adicionais, não aumentou o tamanho da tabela
Como pode ser isso? Eu esperaria que o tamanho da tabela mudasse à medida que o NULLarmazenamento ocupasse espaço

sql-server sql-server-2017
  • 1 1 respostas
  • 319 Views

1 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2022-05-25T04:10:34+08:002022-05-25T04:10:34+08:00

    Algumas pessoas dizem que a sobrecarga por ter uma coluna anulável é de 1 bit por linha, outras que é de 1 byte por linha. Qual é verdade? Eu suponho que seja 1 bit por linha (portanto, 8 linhas fazem 1 byte), estou certo?

    O bitmap nulo é armazenado no nível da linha, portanto, é necessário 1 byte para cada 8 colunas de cada linha. A sobrecarga é incorrida para cada linha, independentemente de a coluna ser definida como anulável ou não (desde o SQL 2000).

    Para valores NULL em varchar, ainda há uma sobrecarga de 2 bytes por linha - é realmente verdade?

    O deslocamento de coluna é armazenado para colunas de comprimento variável NULL, exceto para a(s) última(s), de modo que valores NULL em comprimento variável podem incorrer em uma sobrecarga de 2 bytes, dependendo da posição.

    Pergunta mais importante: eu tenho uma tabela com ~ 250 milhões de linhas de dados, o tamanho total é ~ 115 GB Eu adicionei 7 colunas usando o código abaixo, verificando o tamanho da tabela usando sp_spaceused após cada comando

    É aqui que fica interessante. O SQL Server Enterprise Edition (ou Developer Edition) inclui otimizações de forma que algumas modificações de esquema sejam apenas operações de metadados. Se você executar o mesmo teste na edição Standard ou Express, o espaço dobrará.

    Veja o post de blog Anatomia de um registro de Paul Randal . Embora antiga, a maioria ainda se aplica à versão atual do SQL Server, incluindo o Banco de Dados SQL do Azure.

    • 5

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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