sql >> Databasteknik >  >> RDS >> Sqlserver

Unik identifierare (guide) som primär nyckel i databasdesign

En 128-bitars GUID (uniqueidentifier )-nyckeln är naturligtvis 4x större än en 32-bitars int nyckel. Det finns dock några viktiga fördelar:

  • Inga "IDENTITETSINFOGA"-problem vid sammanslagning av innehåll
  • Om du använder ett COMB-värde istället för NEWSEQUENTIALID(), får du en "gratis" INSERT tidsstämpel. Du kan till och med SELECT från primärnyckeln baserat på ett datum-/tidsintervall om du vill med några snygga CAST() samtal.
  • De är globalt unika, vilket visar sig vara ganska praktiskt då och då.
  • Eftersom det inte finns något behov av att spåra högvattenmärken kan ditt BL-lager tilldela värdet snarare än SQL Server, vilket eliminerar steget SELECT scope_identity() för att hämta primärnyckeln efter en infogning.
  • Om det till och med är mycket möjligt att du kan ha mer än 2 miljarder poster, måste du använda bigint (64 bitar) istället för int . När du har gjort det, uniqueidentifier är bara dubbelt så stor som en bigint .
  • Att använda GUID gör det säkrare att exponera nycklar i webbadresser etc. utan att utsätta dig för "gissa-ID"-attacker.
  • Mellan hur SQL Server laddar sidor från disken och hur processorer nu är mestadels 64-bitars, bara för att ett tal är 128 bitar istället för 32 betyder det inte att det tar 4 gånger längre tid att jämföra. Det senaste testet jag såg visade att GUID:er är nästan lika snabba.
  • Indexstorlek beror på hur många kolumner ingår. Även om själva GUID:erna är större, kan de extra 8 eller 12 byten vara obetydliga jämfört med de andra kolumnerna i indexet.

I slutändan är det kanske inte värt att klämma ut en liten prestandafördel genom att använda heltal att förlora fördelarna med en GUID. Testa det empiriskt och avgör själv.

Personligen använder jag fortfarande båda, beroende på situationen, men den avgörande faktorn har aldrig riktigt kommit till prestanda i mitt fall.



  1. Hur man konverterar en sträng till versaler i SQL

  2. Hur får man aktuellt datum i PL/SQL?

  3. Uppdatera fråga if-sats för Oracle

  4. Exekvera flera SQL-frågor i en sats med PHP