Wydajność złożonego klucza głównego jako klucza obcego

12

Mam tabelę z kompozytowym kluczem podstawowym (składającym się z 4 kolumn), która służy do zapewnienia, że ​​żadne duplikaty nie zostaną wprowadzone do tabeli. Potrzebuję teraz nowej tabeli, która będzie musiała odwoływać się do kluczy w tej tabeli jako kluczy obcych.

Moje pytanie brzmi, które podejście jest bardziej wydajne dla prędkości wyszukiwania:

1) Czy utworzę nową tabelę zawierającą wszystkie 4 kolumny i odwołam się do nich w kluczu obcym.

lub

2) Czy utworzę nową kolumnę tożsamości w tabeli klucza podstawowego i użyję jej jako klucza obcego w nowej tabeli?

Oczekuje się, że ta baza danych pomieści bardzo dużą ilość danych, więc zbudowałem ją do tej pory w celu zminimalizowania ilości danych przechowywanych w każdej tabeli. Mając to na uwadze, najlepszym rozwiązaniem będzie opcja 2, ponieważ zapisam 2 kolumny int i kolumnę datetime dla każdego wiersza, ale chcę uniknąć wydłużania czasu wyszukiwania, jeśli nie jest to konieczne.

aaroncatlin
źródło
1
W takim przypadku prawie zawsze używałbym klucza zastępczego (np. INT IDENTITYAn) - znacznie ułatwia to odwoływanie się do tej tabeli i dołączanie do niej. Aby uniknąć duplikatów, nałóż ograniczenie UNIKALNE na te cztery kolumny. Ponadto: wąskie klucze podstawowe są znacznie lepsze ze względu na wydajność (jeśli są używane jako klucz klastrowania)
marc_s

Odpowiedzi:

11

Koszt użycia prostej syntetycznej liczby całkowitej PK jest niewielki, a korzyść w twoim przypadku byłaby prawdopodobnie znaczna.

  • Jak zauważyłeś, będziesz mieć znacznie prostszy związek z FK.
  • Mały PK tworzy małe (i szybkie) indeksy. Twoje całkowite miejsce w tabeli prawdopodobnie zostanie zmniejszone przez dodanie takiej kolumny.
  • Jeśli reguły biznesowe kiedykolwiek się zmienią, nie będziesz musiał zmieniać kolejności tabeli.

Jedynym istotnym minusem, który przychodzi na myśl, jest to, że możesz stracić wydajność w przypadku zapytań, które skorzystały na klastrowaniu na złożonym PK. Jeśli uważasz, że to może być znaczące, kontynuuj grupowanie złożonego klucza kandydującego, ale umieść PK na kluczu syntetycznym.

Jon of All Trades
źródło
5

Jak to często bywa w świecie SQL, odpowiedź brzmi: „To zależy”.

Spójrz na to pytanie, aby uzyskać wskazówki: Czy klucze naturalne zapewniają wyższą lub niższą wydajność w SQL Server niż zastępcze klucze całkowite?

Zdarzają się przypadki poprawy wydajności przy użyciu kluczy naturalnych jako kluczy obcych. Jednak w większości przypadków lepsze będą mniejsze klucze (czytaj: klucze zastępcze).

Jeśli wprowadzisz tę kolumnę TOŻSAMOŚCI, uczyniłbym ją nawet Kluczem Podstawowym, a zamiast tego zmieniłem kolumny „naturalne” na WYJĄTKOWE OGRANICZENIE.

Sebastian Meine
źródło