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

Uniqueidentifier vs. IDENTITY vs. Material Code – co jest najlepszym wyborem dla klucza podstawowego?

GUID może 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ć jest użycie GUID kolumna jako klucz 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. To może być naprawdę wszystko - INT , GUID , ciąg — wybierz, 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 domyślną opcję.

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 GUID na dwa oddzielne klucze - klucz podstawowy (logiczny) w GUID , a klucz grupowania (porządkujący) na oddzielnym INT IDENTITY(1,1) kolumna.

Jako Kimberly Tripp - królowa indeksowania - a inni twierdzili bardzo wiele razy - GUID ponieważ klucz klastrowania nie jest optymalny, ponieważ ze względu na jego losowość doprowadzi 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 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 powinno wystarczyć dla większości tabel - i w porównaniu z GUID jako klucz klastrowania możesz zaoszczędzić sobie setki megabajtów pamięci na dysku i w pamięci serwera.

Szybkie obliczenia - przy użyciu INT w porównaniu z GUID jako klucz podstawowy i klastrowy:

  • 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 - świetne rzeczy Kimberly Tripp - przeczytaj, przeczytaj jeszcze raz, przetrawij! To naprawdę ewangelia indeksowania SQL Server.

Chyba że masz bardzo dobry powód , sugerowałbym użycie INT IDENTITY dla prawie każdej „prawdziwej” tabeli danych jako domyślnej dla ich klucza podstawowego — jest unikalna, stabilna (nigdy się nie zmienia), jest wąska, stale rośnie — wszystkie dobre właściwości który chcesz mieć w kluczu klastrowym, aby zapewnić szybką i niezawodną wydajność tabel SQL Server!

Jeśli masz jakąś „naturalną” wartość klucza, która również ma wszystkie te właściwości, możesz również użyć jej zamiast klucza zastępczego. Ale dwa ciągi o zmiennej długości max. Według mnie 20 znaków każdy nie spełnia tych wymagań.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można zapisać danych do transportu. Rusztowanie Vs2017 ASP.net core (MSSQL WINDOW 10)

  2. SQL Server 2008 Wyszukiwanie pełnotekstowe w tabeli ze złożonym kluczem podstawowym

  3. Zamów kolumnę według niskiego, średniego, wysokiego?

  4. SQL — pobierz podciąg po pierwszej i drugiej spacji w osobnych kolumnach

  5. Zła wydajność zapytania SQL z powodu klauzuli ORDER BY