Atualmente, temos um banco de dados e aplicativo existentes que são totalmente funcionais. Eu não tenho a capacidade de alterar a arquitetura neste momento. Hoje, cada tabela no banco de dados possui um campo "IsDeleted" NOT NULL BIT com o padrão '0'. Quando o aplicativo "exclui" dados, ele simplesmente atualiza o sinalizador IsDeleted para 1.
O que estou tendo problemas para entender é como os índices em cada uma das tabelas devem ser estruturados. No momento, todas as consultas / associações / etc sempre implementam a verificação IsDeleted. É um padrão que nossos desenvolvedores devem seguir. Dito isto, estou tentando determinar se todos os meus índices de chave primária em cluster em cada uma das tabelas precisam ser alterados para incluir a chave primária AND o campo IsDeleted BIT. Além disso, desde CADA consulta / junção / etc. deve implementar a verificação IsDeleted, é uma suposição apropriada que TODOS os índices (também não agrupados em cluster) incluam o campo IsDeleted como o primeiro campo do índice?
Outra pergunta que tenho é sobre índices filtrados. Eu entendo que eu poderia colocar filtros nos índices como "WHERE IsDeleted = 0" para reduzir o tamanho dos índices. No entanto, como toda junção / consulta precisará implementar a verificação IsDeleted, isso impediria o uso do índice filtrado (já que a coluna IsDeleted é usada na junção / consulta)?
Lembre-se, eu não tenho a capacidade de alterar a abordagem IsDeleted.
IsDeleted
coluna, independentemente do armazenamento físico, provavelmente faria sentido expor os dados por meio de duas visualizações (opcionalmente em esquemas diferentes), resolvendo o problema de parametrização e cometendo erros ao acessar dados que não deveriam ter sido acessado menos provável. O acesso aos dados base é relevante apenas nos casos raros em que os dados excluídos e não excluídos precisam ser combinados de alguma forma e quando as linhas realmente precisam ser alteradas para "excluídas".