NOTA: questa risposta riguarda lo sviluppo di classe enterprise in generale .
Si tratta di un problema di RDBMS, non solo di SQL Server, e il comportamento può essere molto interessante. Per uno, mentre è comune che le chiavi primarie siano indicizzate automaticamente (in modo univoco), NON è assoluto. Ci sono momenti in cui è essenziale che una chiave primaria NON sia indicizzata in modo univoco.
Nella maggior parte degli RDBMS, verrà creato automaticamente un indice univoco su una chiave primaria se non ne esiste già una . Pertanto, è possibile creare il proprio indice sulla colonna della chiave primaria prima di dichiararlo come chiave primaria, quindi tale indice verrà utilizzato (se accettabile) dal motore di database quando si applica la dichiarazione della chiave primaria. Spesso è possibile creare la chiave primaria e consentire la creazione del suo indice univoco predefinito, quindi creare il proprio indice alternativo su quella colonna, quindi rilasciare l'indice predefinito.
Ora per la parte divertente: quando NON vuoi un indice di chiave primaria univoco? Non ne vuoi uno e non puoi tollerarne uno, quando la tua tabella acquisisce dati (righe) sufficienti per rendere troppo costosa la manutenzione dell'indice. Questo varia in base all'hardware, al motore RDBMS, alle caratteristiche della tabella e del database e al carico di sistema. Tuttavia, in genere inizia a manifestarsi quando una tabella raggiunge alcuni milioni di righe.
Il problema essenziale è che ogni inserimento di una riga o aggiornamento della colonna della chiave primaria si traduce in una scansione dell'indice per garantire l'unicità. Quella scansione dell'indice univoca (o il suo equivalente in qualsiasi RDBMS) diventa molto più costosa man mano che la tabella cresce, finché non domina le prestazioni della tabella.
Ho affrontato questo problema molte volte con tabelle grandi fino a due miliardi di righe, 8 TB di spazio di archiviazione e quaranta milioni di inserimenti di righe al giorno. Mi è stato assegnato il compito di riprogettare il sistema coinvolto, che includeva l'eliminazione dell'indice della chiave primaria univoca praticamente come passaggio uno. In effetti, l'abbassamento di quell'indice era necessario in produzione semplicemente per riprendersi da un'interruzione, prima ancora di avvicinarsi a una riprogettazione. La riprogettazione includeva la ricerca di altri modi per garantire l'unicità della chiave primaria e per fornire un rapido accesso ai dati.