Abbiamo una grande tabella [MyTable]
che attualmente ha sia a Primary Key
, sia a Unique Non Clustered Index
sulla stessa colonna ( [KeyColumn]
). L'indice U NC ha anche colonne di copertura aggiuntive.
Avere PK e Unique NC Index sulle stesse colonne sembra ridondante, quindi stavo considerando di eliminare la chiave primaria e invece di utilizzare l'indice univoco non cluster per scopi di integrità referenziale.
Si noti che la tabella è interamente raggruppata da un'altra colonna.
cioè Quindi abbiamo:
ALTER TABLE [MyTable]
ADD CONSTRAINT [PK_MyTable]
PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
E
CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex]
ON [MyTable] ([KeyColumn])
INCLUDE ([Column1], [Column2])
GO
Per quanto ne so, non è possibile aggiungere colonne di copertura a una chiave primaria, quindi intendo fare:
- Eliminare i vincoli di chiave esterna su cui fare affidamento
MyTable.KeyColumn
- Eliminare la chiave primaria su
MyTable.KeyColumn
tutto - Aggiungi nuovamente le chiavi esterne alla tabella (ovvero il RI verrà applicato tramite
MyTable.KeyColumn
)
L'unica conseguenza che posso pensare di fare questo è che non otterremo il simbolo della chiave visiva sui nostri diagrammi ERD e che la densità dell'indice (foglia) sarà inferiore a causa delle colonne incluse.
Ho letto /programming/487314/primary-key-or-unique-index e sono contento degli aspetti di integrità e prestazioni di questo.
La mia domanda è: questo approccio è imperfetto?
Modifica Cosa sto cercando di realizzare : ottimizzazione delle prestazioni e pulizie di primavera . Rimuovendo il PK o un indice, ci saranno meno pagine necessarie per i miei indici = scritture più veloci, oltre a vantaggi di manutenzione / operativi, ovvero un indice in meno per mantenere la deframmentazione, ecc.
Per farci un'idea, non avevo mai avuto una tabella a cui si fa riferimento, senza un PK. Tuttavia, il fatto che un indice NC con colonne di copertura sia stato aggiunto alla tabella significa che devo adattare il mio pensiero.