TransWikia.com

Qual é mais rápido: NULL ou NOT NULL (com uma string vazia)?

Stack Overflow em Português Asked on December 14, 2021

Tenho uma tabela com campos NOT NULL e elas acabam ficando vazias.

Qual a diferença entre um NULL (permite valores nulos) e NOT NULL com uma string vazia ('') dentro?

3 Answers

Em uma resposta curta eu diria que você deve optar por NULL em colunas que não exigem valor até por questões práticas, por exemplo você não pode inserir um valor "" vazio em um campo date por exemplo, terá que ficar convertendo antes de inserir

Exemplo:

INSERT INTO TABELA (CODKEY, DATA_CAD) VALUES (1, '');

Não conheço todos os bancos mas na maioria tem que ser:

INSERT INTO TABELA (CODKEY, DATA_CAD) VALUES (1, null);

E se fizer:

SELECT * FROM TABELA WHERE (DATA_CAD = '');

Não terá resultados ou receberá um erro de conversão

O correto é

SELECT * FROM TABELA WHERE (DATA_CAD IS NULL);

O mesmo pode ocorrer com outros dados que não seja STRING dados do tipo INT

Apesar da sua pergunta se referir a performance, acho que é praticamente nula a diferença em campos devidamente indexados, então eu levaria mais em conta a normatização dos dados neste caso.

Answered by Marcelo on December 14, 2021

A diferença é que um campo NULL pode ficar nulo, ou seja, não é obrigatório possuir nenhum valor. E um campo NOT NULL precisa de algum valor na coluna, seja um string.Empty ou um "".

Creio que se você tem um campo NOT NULL e insere uma string vazia dentro, algo está errado na sua arquitetura, pois de nada vale ter um campo NOT NULL se em algum momento você vai inserir um valor vazio lá dentro. Nesse caso seria melhor transformar esse campo em NULL.

Quando você insere um valor vazio em alguma coluna no banco que aceita NULL, seja esse valor um string.Empty ou "", ele entende que isso é um valor vazio, ou seja, tem um valor ali, porém sem nada dentro. Neste caso, você está ocupando espaço do banco, por menor que seja, para armazenar um valor vazio.

Para que o banco continue mostrando NULL e fique NULL definitivamente, você insere um valor NULL que o banco entenda. Algo do tipo:

 command.Parameters.AddWithValue("@paymentDate", item.Renavam ?? (object)DBNull.Value);

Ou seja, se o item.Renavam for nulo, insere um valor null para o banco, que é o DBNull.Value. Desta forma, sua coluna ainda ficará como NULL.

inserir a descrição da imagem aqui

Answered by perozzo on December 14, 2021

Não tem como responder essa pergunta de forma abstrata, até porque isso nada tem a ver com performance. Performance se dará se tudo for feito certo dentro das necessidades. Se precisar de um deles e não do outro, não importa a performance.

Pode haver performance diferente por circunstâncias. A questão deveria ser semântica.

Há quem diga que você nunca precisa de um NULL, mas isso levado a ferro e fogo pode dar problemas de performance porque implica em normalizar em excesso e exigir operações complexas para obter os dados do jeito que precisa.

NULL significa sem valor, e em branco significa que tem um valor vazio, são coisas diferentes.

0 vs NULL (tem rolo vazio do papel higiênico ou nem o rolo tem

Answered by Maniero on December 14, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP