sql >> Databasteknik >  >> RDS >> Sqlserver

Klustrade vs icke-klustrade

Skillnaden mellan ett klustrat och ett icke-klustrat index är att det klustrade indexet bestämmer den fysiska ordningen för raderna i databasen . Med andra ord, att tillämpa det klustrade indexet på PersonId betyder att raderna kommer att sorteras fysiskt efter PersonId i tabellen, vilket tillåter en indexsökning på detta att gå direkt till raden (istället för ett icke-klustrat index, vilket skulle leda dig till radens plats och lägga till ett extra steg).

Som sagt, det är ovanligt för att primärnyckeln inte ska vara det klustrade indexet, men inte ovanligt. Problemet med ditt scenario är faktiskt motsatsen till vad du antar:du vill ha unikt värden i ett klustrat index, inte dubbletter. Eftersom det klustrade indexet bestämmer den fysiska ordningen för raden, om indexet är på en icke-unik kolumn, måste servern lägga till ett bakgrundsvärde till rader som har ett duplicerat nyckelvärde (i ditt fall, alla rader med samma PersonId ) så att det kombinerade värdet (nyckel + bakgrundsvärde) är unikt.

Det enda jag skulle föreslå är inte med hjälp av en surrogatnyckel (ditt CourtOrderId ) kolumnen som primärnyckel, men använd istället en sammansatt primärnyckel av PersonId och någon annan unikt identifierande kolumn eller uppsättning kolumner. Om det inte är möjligt (eller inte praktiskt), lägg sedan det klustrade indexet på CourtOrderId .



  1. eko i omvänd ordning från mysql_fetch_assoc()

  2. Anropa php-skript med C# (Unity)

  3. fråga om pl/sql lagrad programtext

  4. ostödd Scan, lagring av drivrutin.Värde skriv []uint8 i typ *time.Time