Attualmente, abbiamo un database e un'applicazione esistenti che sono completamente funzionali. Non ho la possibilità di cambiare l'architettura a questo punto. Oggi, ogni tabella nel database ha un campo "IsDeleted" NOT NULL BIT con un valore predefinito di '0'. Quando l'applicazione "elimina" i dati, aggiorna semplicemente il flag IsDeleted a 1.
Quello che ho difficoltà a capire è come dovrebbero essere strutturati gli indici su ciascuna delle tabelle. In questo momento, ogni query / join / etc implementa sempre il controllo IsDeleted. È uno standard che i nostri sviluppatori devono seguire. Detto questo, sto cercando di determinare se tutti i miei indici di chiave primaria in cluster su ciascuna delle tabelle devono essere modificati per includere la chiave primaria E il campo BIT IsDeleted. Inoltre, poiché OGNI query / join / ecc. deve implementare il controllo IsDeleted, è un presupposto appropriato che OGNI SINGOLO indice (anche non cluster) dovrebbe includere il campo IsDeleted come primo campo dell'indice?
Un'altra domanda che ho riguarda gli indici filtrati. Comprendo che potrei mettere filtri sugli indici come "WHERE IsDeleted = 0" per ridurre la dimensione degli indici. Tuttavia, poiché ogni join / query dovrà implementare il controllo IsDeleted, ciò impedirebbe l'utilizzo dell'indice filtrato (poiché la colonna IsDeleted viene utilizzata in join / query)?
Ricorda, non ho la possibilità di cambiare l'approccio IsDeleted.
IsDeleted
colonna, indipendentemente dall'archiviazione fisica, probabilmente avrebbe senso esporre i dati attraverso due viste (opzionalmente in schemi diversi), risolvendo sia il problema della parametrizzazione sia commettendo errori nell'accesso ai dati che non avrebbero dovuto essere accesso meno probabile. L'accesso ai dati di base è rilevante solo per i rari casi in cui i dati cancellati e quelli non cancellati devono essere combinati in qualche modo e quando le righe devono essere commutate su "cancellate".