Powiedziano mi, że jeśli obcy klucz dwie tabele, SQL Server utworzy coś podobnego do indeksu w tabeli potomnej. Trudno mi uwierzyć, że to prawda, ale nie mogę znaleźć wiele związanych z tym zagadnień.
Moim prawdziwym powodem do tego jest to, że mamy bardzo wolny czas odpowiedzi w instrukcji delete na tabelę, która prawdopodobnie ma 15 powiązanych tabel. Zapytałem naszego gościa z bazy danych, a on odpowiada, że jeśli w polach znajduje się klucz obcy, to działa jak indeks. Jakie jest twoje doświadczenie z tym? Czy powinienem dodawać indeksy do wszystkich pól kluczy obcych, czy są to po prostu niepotrzebne koszty ogólne?
sql-server
Nick DeVore
źródło
źródło
Odpowiedzi:
Klucz obcy jest ograniczeniem, relacją między dwiema tabelami - która nie ma nic wspólnego z indeksem jako takim.
Ale wiadomo, że indeksowanie wszystkich kolumn, które są częścią relacji klucza obcego, ma sens, ponieważ poprzez relację FK często trzeba wyszukać odpowiednią tabelę i wyodrębnić określone wiersze na podstawie pojedyncza wartość lub zakres wartości.
Dlatego warto indeksować dowolne kolumny związane z FK, ale FK jako taki nie jest indeksem.
Sprawdź doskonały artykuł Kimberly Tripp „Kiedy SQL Server przestał umieszczać indeksy w kolumnach kluczy obcych?” .
źródło
REFERENCES
. Automatycznie tworzyUNIQUE
indeks dla ograniczeniaPRIMARY KEY
lubUNIQUE
ograniczenia i wymagaUNIQUE
obecności indeksu dla odnośnego końca relacji klucza obcego, ale nie robi nic automatycznie dla końca referencyjnego , chociaż często dobrym pomysłem jest utworzenie go samodzielnie. Zobacz stackoverflow.com/questions/970562/…Wow, odpowiedzi są na całej mapie. Więc Dokumentacja mówi:
Ograniczenie klucza OBCEGO jest kandydatem do indeksu, ponieważ:
Zmiany ograniczeń KLUCZ PODSTAWOWY są sprawdzane za pomocą ograniczeń KLUCZ OBCY w powiązanych tabelach.
Kolumny klucza obcego są często używane w kryteriach łączenia, gdy dane z powiązanych tabel są łączone w zapytaniach poprzez dopasowanie kolumn (-y) w ograniczeniu KLUCZ OBCY w jednej tabeli z podstawowymi lub unikatowymi kolumnami (kluczami) w drugiej tabeli. Indeks pozwala Microsoft® SQL Server ™ 2000 szybko znaleźć powiązane dane w tabeli kluczy obcych. Jednak utworzenie tego indeksu nie jest wymagane. Dane z dwóch powiązanych tabel można łączyć, nawet jeśli między tabelami nie zdefiniowano żadnych ograniczeń KLUCZ PIERWOTNY lub KLUCZ ZAGRANICZNY, ale relacja klucza obcego między dwiema tabelami wskazuje, że dwie tabele zostały zoptymalizowane do połączenia w zapytaniu, które używa kluczy jako jego kryteria.
Wydaje się więc dość jasne (choć dokumentacja jest nieco zamazana), że tak naprawdę nie tworzy indeksu.
źródło
Nie, nie ma niejawnego indeksu dla pól klucza obcego, w przeciwnym razie dlaczego Microsoft powiedziałby „Tworzenie indeksu na kluczu obcym jest często przydatne” . Twój kolega może być mylące pole klucza obcego w tabeli krajowego z klucza podstawowego w określonych do stołu - kluczy podstawowych należy utworzyć indeks niejawny.
źródło
SQL Server automatycznie tworzy indeksy dla kluczy podstawowych, ale nie dla kluczy obcych. Utwórz indeks dla kluczy obcych. Prawdopodobnie jest to narzut.
źródło
Załóżmy, że masz duży stół zwany zleceniami i mały stół zwany klientami. Istnieje klucz obcy od zamówienia do klienta. Teraz, jeśli usuniesz klienta, Sql Server musi sprawdzić, czy nie ma żadnych zamówień osieroconych; jeśli tak, wywołuje błąd.
Aby sprawdzić, czy są jakieś zamówienia, Sql Server musi przeszukać tabelę dużych zamówień. Teraz, jeśli istnieje indeks, wyszukiwanie będzie szybkie; jeśli nie, wyszukiwanie będzie wolne.
W takim przypadku powolne usuwanie można wyjaśnić brakiem indeksu. Zwłaszcza jeśli Sql Server będzie musiał przeszukać 15 dużych tabel bez indeksu.
PS Jeśli klucz obcy ma opcję USUŃ KASKADĘ, serwer Sql nadal musi przeszukiwać tabelę zamówień, ale następnie usunąć wszelkie zamówienia, które odnoszą się do usuniętego klienta.
źródło
Klucze obce nie tworzą indeksów. Indeksy tworzą tylko alternatywne ograniczenia klucza (UNIQUE) i ograniczenia klucza podstawowego. Dotyczy to Oracle i SQL Server.
źródło
Nic mi nie wiadomo. Klucz obcy dodaje tylko ograniczenie, że wartość w kluczu potomnym jest również reprezentowana gdzieś w kolumnie nadrzędnej. Nie mówi bazy danych, że klucz potomny również musi być indeksowany, a jedynie ograniczony.
źródło
Ściśle mówiąc, klucze obce nie mają absolutnie nic wspólnego z indeksami, tak. Ale, jak zauważyli przede mną głośniki, sensowne jest stworzenie takiego, aby przyspieszyć wyszukiwanie FK. W rzeczywistości, w MySQL, jeśli nie określisz indeksu w deklaracji FK, silnik (InnoDB) utworzy go automatycznie.
źródło
W PostgeSql możesz samodzielnie sprawdzić indeksy, jeśli naciśniesz \ d tablename
Zobaczysz, że indeksy btree zostały automatycznie utworzone na kolumnach z kluczem podstawowym i unikalnymi ograniczeniami, ale nie na kolumnach z kluczami obcymi.
Myślę, że to odpowiada na twoje pytanie przynajmniej dla postgres.
źródło
Zauważam, że Entity Framework 6.1 wskazany na MSSQL automatycznie dodaje indeksy do kluczy obcych.
źródło
InnoDB wymaga indeksów na temat kluczy obcych i kluczy odwołuje tak, że klucz obcy kontrole mogą być szybko i nie wymagają skanowania tabeli. W tabeli odwołań musi istnieć indeks, w którym kolumny kluczy obcych są wymienione jako pierwsze kolumny w tej samej kolejności.
źródło