Questa domanda viene in su dopo aver letto un commento in questo domanda:SQL - molti-a-molti tabella primaria chiave
Quando si crea una relazione molti-a-molti tavolo, si dovrebbe creare un composito chiave primaria sulle due colonne chiave esterna o creare una chiave primaria "ID" sostitutiva di auto-incremento e inserire solo indici sulle due colonne FK (e forse un vincolo univoco)? Quali sono le implicazioni sulla performance per l'inserimento di nuovi record/reindicizzazione in ciascun caso?
Fondamentalmente, questo:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
vs. questo:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Il commentatore dice:
rendendo i due ID PK significa che la tabella di è fisicamente ordinato in base il disco in questo ordine. Quindi se inseriamo (Parte1/Dispositivo1), (Parte1/Dispositivo2), (Parte2/Dispositivo3), quindi (Parte 1/Dispositivo3) il database dovrà rompere il tavolo e inserire l'ultimo tra le voci 2 e 3. Per molti record , questo diventa molto problematico poiché consiste nel mescolare centinaia, migliaia o milioni di record ogni volta che ne viene aggiunto uno. Al contrario, un PK autoincrementante consente ai nuovi record di virare fino alla fine.
Il motivo che mi sto chiedendo è perché sono sempre stato incline a fare la chiave primaria composta senza colonna a incremento automatico surrogata, ma non sono sicuro se la chiave surrogata è in realtà più performante.
ottima domanda, in attesa di alcune risposte da sql guru :) – sbczk
Ecco una domanda silimar pubblicata su SO: http://stackoverflow.com/questions/344068/sql-server-clustered-index-order-of-index- domanda – Tony
(tentativo di aggiungere questo al mio commento precedente ma non è possibile) A seconda del numero di inserti è anche possibile ricostruire periodicamente l'indice per assicurarsi che restituisca risultati rapidamente. In SQL Server è anche possibile modificare il FILLFACTOR dell'indice per fornire spazio sufficiente per gli inserti prima di spostare i dati. – Tony