Geralmente uso uma chave composta (CreatedTime, Status)
para minha Log
tabela, mas estou reconsiderando esse design. Como CreatedTime
é tipicamente muito única e Status
tem apenas 3-5 valores possíveis, parece que isso Status
pode não adicionar muito à filtragem posterior CreatedTime
.
A maioria das minhas consultas envolve recuperar logs para um intervalo de tempo específico, opcionalmente filtrando ou contando por Status
. Conceitualmente, se eu estivesse trabalhando com um livro de registro físico classificado por tempo, identificar entradas com um específico Status
(por exemplo, "Bem-sucedido") seria trabalhoso. Por outro lado, ter livros de registro separados para cada Status
, todos classificados por tempo, poderia tornar a pesquisa mais eficiente — embora combinar e reclassificar resultados para todos Status
os valores possa complicar as coisas. O banco de dados otimiza para tais cenários?
Já perguntei a três IAs diferentes sobre isso, mas suas respostas foram vagas e contraditórias (e até mesmo a mesma IA dá respostas diferentes apenas perguntando de forma ligeiramente diferente), e não consigo encontrar muita coisa no Google e no SO. Alguém pode confirmar se minha intuição aqui está correta?
Seus índices devem ser baseados em como você normalmente consulta seus dados. Como você normalmente consulta logs para um determinado intervalo de datas, então um índice em
CreatedTime
seria mais eficiente. Duvido que o kay on secundárioStatus
faça uma diferença significativa, a menos que você consulte um número muito grande de logs sem seu intervalo de datas, apenas alguns correspondem ao status que você deseja. Além disso, como você provavelmente não tem vários logs de status diferentes exatamente ao mesmo tempo, o subíndice não está ajudando, pois ele terá que escanear todos os registros de índice para o período de tempo fornecido de qualquer maneira.A indexação
Status, CreatedTime
não será significativamente mais rápida do queCreatedDate, Status
se você quisesse logs de um status, e terá menos desempenho se você forçar o mecanismo a escanear vários status e consolidar os resultados.De importância secundária é como os dados são adicionados . Como você quase certamente adiciona logs sequencialmente, a indexação por
Status, CreatedTime
será menos eficiente, pois você estará inserindo registros no meio com bastante frequência, dificultando a adição de registros. A indexação porCreatedTime
significa que você quase sempre estará adicionando registros ao final da sua tabela, exceto atividades incomuns, como importações em massa de logs mais antigos.Eu recomendaria 2 índices:
CreatedTime
Status, CreatedTime where Status != 'OK'
- um índice parcialVocê gostaria de consultar todos os logs por algum período de tempo e também, por exemplo, todas as entradas com
Status=Error
por algum período de tempo. Esses 2 índices ajudarão você com ambos. Como a vasta maioria das entradas de log provavelmente teráOK
status (ou equivalente), então o segundo índice será muito menor.Armazenar logs em um banco de dados geralmente não é muito econômico. Pode causar longos tempos de backup e restauração, aumentos repentinos de uso de armazenamento causando erros de falta de espaço de armazenamento, picos de uso de IO não planejados enquanto ele é aspirado e outros problemas potenciais.