Estou pensando em usar a datetime2(7)
como um índice clusterizado.
Se eu sempre preencher essa coluna usando SYSDATETIME
, é possível que a mesma instância emita o mesmo valor duas vezes (supondo que não façamos algo como atrasar o relógio do sistema)?
Como alternativa, qual é uma estratégia coesa para garantir exclusividade em tal coluna, mesmo que isso tenha um custo de precisão de tempo?
Para meu uso, eu realmente só me importo com os segundos, mas farei muitas consultas de intervalo nesta coluna para que o CI pareça apropriado.
Sim. A resolução do relógio do Windows é decente, mas não perfeita. Você deve usar outro campo, como um
INT IDENTITY
, para garantir exclusividade. Mas vá em frente e agrupe na data primeiro , se for adequado às suas necessidades.Como alternativa, você pode usar um
DATETIME
PK, mas supervisionar as inserções com um procedimento armazenado que verifica a exclusividade da data de entrada e faz uma pausa, se necessário. Posso preparar um exemplo, se você quiser.Editar:
Outra opção, emprestada do comentário do ypercube, seria um índice clusterizado não exclusivo no campo de data e uma chave primária não clusterizada exclusiva no
ID
campo. Isso manteria seus outros índices menores, pois apontariam para aID
coluna estreita, mas também implicaria dois saltos para obter os dados reais.Tenha cuidado ao escolher sua KEY de índice clusterizado porque ela será propagada para todos os índices não clusterizados de sua tabela. Os valores Datetime2 têm 8 bytes de comprimento, você pode considerar
INT IDENTITY
como Jon disse.