CONTEUDO NULL EM CAMPOS DB AUMENTA O BANCO?

LUIS.HERRERA 12/07/2011 11:25:25
#378992
Bom dia, Fiz um aplicativo que migra todos os dados de um banco Access para outro com estrutura diferente. Porém ao final do processo o banco novo fica com ex: 4.7 MB, mas se eu aplicao o reparar/compactar ele fica com 3.6 MB.

Pergunta, ao gravar cada registro de uma tabela, eu vejo se o conteúdo do campo é Null e coloco Null no novo banco, pois como são várias tabelas e campos que podem ou não ter conteúdo, não dá para ter uma instrução Insert diferente para cada situação, seria um código absurdo de grande. Será que o fato de mandar inserir um Null no campo vazio aumenta o tamanho do banco?

Nota: O problema que não posso usar o reparar/compactar do jet pela aplicação VB6 no cliente, pois tem clientes onde funciona e outros não, não sei porque, apesar das bibliotecas estarem instaladas. Esse teste fiz na máquina de desenvolvimento, e não tenho como compactar no cliente, por isso a dúvida. será que existiria uma forma de não mandar colocar Null num campo vazio, sem ter que criar várias linhas de IF com Inserts diferentes, em função de qual campo está vazio num mesmo registro?
MARCELO.TREZE 12/07/2011 11:53:30
#378994
Resposta escolhida
Sim o NULL ocupa espaço em disco, apesar dele ter uma conotação de que é algo vazio, os bancos de dados precisam de uma representação do mesmo, o que acaba ocupando espaço no disco,(exceto no ORACLE que simplismente ignora campos NULL) no SQLserver 2008 vc pode criar uma tabela SPARSE NULL que contorna este problema.

já que é um sistema que migra de um DB para outro DB diferente, sugiro estudar cada um deles separadamente.

LUIS.HERRERA 12/07/2011 12:44:28
#378996
Marcelo obrigado.
Goodspeakers não é bem assim, há campos que só são usados se uma situação é atendida. Assim por exemplo o tempo de arquivo de um documento, se ele é arquivado então se grava esse tempo 2 anos por exemplo, e se é destruído após um período inicial, então não grava nada, assim o banco não tem informação.

O problema está ao transferir os dados de um banco em uso para um limpo, quando se faz mudança da estrutura dele, com isso sou obrigado a checar se no registro o campo é nullo ou tem valor, e assim preencher, pois se for nulo não dá para usar a instrução abaixo (pois dá erro)..


Insert......... & IIF(campo <> Null, txtCampo.Text) [ô] isso dá erro ou
Insert......... & IIF(campo <> Null, txtCampo.Text,) [ô]também dá erro

Para não ter que fazer um monte de IFs encadeados e uma instrução Insert para cada situação de um campo na tabela que pode ser null, então eu gravo assim:
Insert......... & IIF(campo <> Null, txtCampo.Text, [Ô]Null[Ô] )

Então pelo que percebi e o Marcelo confirmou, o Null passado ao banco é diferente do Null quando ele não é iniciado, mas como não dá para gravar um registro quando um campo é incluído no Insert sem informar um tipo de valor, ele está tratando de outra forma, apesar do conteúdo na tabela ser igual Null, só que assim ocupa espaço, mas ao dar um compactar ele retira isso.

Nota: Estranho como nas duas situações (null sem entrar dados ou Null passado) a pesquisa se campo = Null é a mesma, mas um tem valor e o outro não. Estranho isso.

Obrigado novamente.
MARCELO.TREZE 12/07/2011 13:05:57
#378998
e isso depende muito do tipo do campo também

exemplo no Mysql

para campos do tipo char é reservado 01 byte a mais, para campos do tipo text e blob 02 bytes.

então se vc informar por exemplo 04 bytes em caracates ex:[Ô]aaaa[Ô] serã armazenados 05 bytes, e se este valor for null, será armazenado 01 byte
entendeu mais ou mesno como funciona
Tópico encerrado , respostas não são mais permitidas