Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

EF 4.0 Guid lub Int jako klucz podstawowy

Zgadzam się z Tobą w 100% - używając INT IDENTITY jest znacznie lepszy!

Identyfikatory GUID mogą wydawać się naturalnym wyborem dla twojego klucza podstawowego - a jeśli naprawdę musisz, prawdopodobnie możesz argumentować, aby użyć go jako klucza podstawowego tabeli. Czego zdecydowanie odradzam nie robić używa kolumny GUID jako klucza klastrowania , co SQL Server robi domyślnie, chyba że wyraźnie zabronisz mu tego.

Naprawdę musisz oddzielić dwa problemy:

1) klucz podstawowy to konstrukcja logiczna — jeden z kluczy kandydujących, który jednoznacznie i niezawodnie identyfikuje każdy wiersz w tabeli. Może to być wszystko, naprawdę - INT, GUID, łańcuch - wybierz to, co jest najbardziej sensowne dla twojego scenariusza.

2) klucz klastrowania (kolumna lub kolumny, które definiują „indeks klastrowy” w tabeli) – jest to fizyczny rzecz związana z pamięcią masową, a tutaj najlepszym wyborem jest mały, stabilny, stale rosnący typ danych - INT lub BIGINT jako opcja domyślna.

Domyślnie klucz podstawowy w tabeli SQL Server jest również używany jako klucz klastrowy — ale nie musi tak być! Osobiście widziałem ogromny wzrost wydajności podczas dzielenia poprzedniego klucza podstawowego / klastrowego opartego na identyfikatorze GUID na dwa oddzielne klucze - klucz podstawowy (logiczny) w identyfikatorze GUID i klucz klastrowania (uporządkowania) na oddzielnym identyfikatorze INT (1, 1) kolumna.

Jako Kimberly Tripp - Królowa indeksowania - i inni stwierdzili wiele razy - GUID jako klucz klastrowania nie jest optymalny, ponieważ ze względu na jego losowość prowadzi do ogromnej fragmentacji stron i indeksów oraz ogólnie do złej wydajności.

Tak, wiem - jest newsequentialid() w SQL Server 2005 i nowszych - ale nawet to nie jest naprawdę i w pełni sekwencyjne, a zatem również cierpi na te same problemy, co identyfikator GUID - tylko trochę mniej widoczne.

Jest jeszcze jedna kwestia do rozważenia:klucz klastrowania w tabeli zostanie dodany do każdego wpisu w każdym indeksie nieklastrowanym w Twojej tabeli - dlatego naprawdę chcesz się upewnić, że jest on tak mały, jak to możliwe. Zazwyczaj INT z ponad 2 miliardami wierszy powinien wystarczyć dla większości tabel – aw porównaniu z identyfikatorem GUID jako kluczem klastrowania można zaoszczędzić setki megabajtów pamięci na dysku i w pamięci serwera.

Szybkie obliczenia — użycie INT vs. GUID jako klucza podstawowego i klucza klastrowego:

  • Tabela podstawowa z 1 000 000 wierszy (3,8 MB vs. 15,26 MB)
  • 6 indeksów nieklastrowych (22,89 MB w porównaniu z 91,55 MB)

ŁĄCZNIE:25 MB vs. 106 MB - i to tylko na jednym stole!

Trochę więcej do myślenia - doskonałe rzeczy Kimberly Tripp - przeczytaj, przeczytaj jeszcze raz, przetrawij! To naprawdę ewangelia indeksowania SQL Server.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie zmiennej w zapytaniu OPENROWSET

  2. Jak przestawić nieznaną liczbę kolumn i brak agregacji w SQL Server?

  3. Czy można używać agregatów zdefiniowanych przez użytkownika (clr) z funkcjami okna (over)?

  4. Połącz wartości na podstawie ID

  5. Znajdź znaki spoza zestawu ASCII w kolumnach varchar za pomocą SQL Server