Eu tenho uma tabela onde desejo rastrear operações do tipo booleano. além disso, um requisito de negócios é que eu saiba a data da ação e não apenas o valor booleano.
por exemplo, se uma mensagem for lida ou excluída.
Gostaria de usar um campo de data e hora para poder quantificar todas as mensagens não lidas como nulas ou com um valor de data e hora para leitura. Recebo operação booleana e carimbos de data/hora.
Minha única dúvida sobre isso é quão eficiente será a seleção de todas as mensagens não lidas?
Digamos que em uma tabela com alguns milhões de registros e um índice não clusterizado em um campo como read, um select teria um desempenho muito pior do que se o campo fosse um booleano?
O desempenho de um projeto específico depende em grande parte da distribuição de dados e do caminho de acesso. Você espera que a maioria das mensagens tenha o sinalizador ou que a maioria das mensagens não tenha? Dos documentos :
E, claro, se houver outros predicados na consulta e o índice clusterizado, se houver. Por exemplo, você provavelmente deseja acessar todas as mensagens não lidas dentro de um determinado período de tempo? Ou enviado para/de um usuário em particular? Qual é o tamanho dos corpos das mensagens e eles são armazenados em linha? Estas são apenas perguntas retóricas, veja bem.
Então, qual é melhor, a
BIT
e aDATETIME
ou apenas aDATETIME
para desempenho? Você terá que comparar com alguns dados representativos e padrões de acesso para descobrir. Receio que esta não possa ser respondida apenas com teoria. Mas é claro que você pode criar a tabela com o booleano e simplesmente não usá-lo se achar que o último é melhor - ele adiciona apenas uma sobrecarga de 1 byte por linha.Se você estivesse fazendo a pergunta oposta, como consultar com eficiência as not-
NULL
rows, eu diria para usar um índice filtrado .Procure criar o arquivo
index with included columns
. Verifique este link . Se você deseja selecionar todas as mensagens não lidas e ver suas datas, crie o índice na coluna READ e inclua a coluna DATE. Se você deseja selecionar um intervalo de datas e contar o número de mensagens lidas/não lidas, crie o índice no campo DATE e inclua a coluna READ. Além disso, você pode definir a coluna Boolean READ com um valor padrão (digamos 0) que corresponda a não lido, em vez de usar NULL. Não tenho certeza se haverá algum benefício de desempenho nisso.