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

Indeksowanie Entity Framework WSZYSTKIE kolumny kluczy obcych

W EF Code First ogólnym powodem modelowania relacji klucza obcego jest nawigacja między jednostkami. Rozważ prosty scenariusz Country i City , z gorliwym ładowaniem zdefiniowanym dla następującej instrukcji LINQ:

var someQuery = 
   db.Countries
     .Include(co => co.City)
     .Where(co => co.Name == "Japan")
     .Select(...);

Spowoduje to zapytanie w następujący sposób:

SELECT *
FROM Country co
INNER JOIN City ci
  ON ci.CountryId = co.ID
WHERE co.Name = 'Japan';

Bez indeksu klucza obcego w City.CountryId , SQL będzie musiał przeskanować tabelę Miasta, aby przefiltrować miasta dla kraju podczas JOIN.

Indeks FK będzie miał również korzyści w zakresie wydajności, jeśli wiersze zostaną usunięte z tabeli Kraj nadrzędny, ponieważ integralność referencyjna będzie musiała wykryć obecność wszystkich połączonych wierszy Miasta (niezależnie od tego, czy FK ma ON CASCADE DELETE zdefiniowane lub nie).

TL;DR

Indeksy kluczy obcych zalecane , nawet jeśli nie filtrujesz bezpośrednio klucza obcego, nadal będzie on potrzebny w sprzężeniach. Wyjątki od tego wydają się dość wymyślne:

  • Jeśli selektywność klucza obcego jest bardzo niska, np. w powyższym scenariuszu, gdyby 50% WSZYSTKICH miast w tabeli krajów znajdowało się w Japonii, Indeks nie byłby przydatny.

  • Jeśli faktycznie nigdy nie poruszasz się po związku.

  • Jeśli nigdy nie usuniesz wierszy z tabeli nadrzędnej (lub nie spróbujesz aktualizacji w PK).

Jedną z dodatkowych kwestii dotyczących optymalizacji jest to, czy użyć klucza obcego w Clustered Index tabeli podrzędnej (tj. klaster Cities by Country). Jest to często korzystne w relacjach tabel nadrzędny :podrzędny, gdzie powszechne jest jednoczesne pobieranie wszystkich wierszy podrzędnych dla rodzica.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz lewą część ciągu w SQL Server (T-SQL)

  2. Interfejsy sieciowe SQL, błąd:50 — wystąpił błąd w czasie wykonywania lokalnej bazy danych. Nie można utworzyć automatycznej instancji

  3. Kod Entity-framework działa wolno przy wielokrotnym użyciu funkcji Include()

  4. Pozycje ORDER BY muszą pojawić się na liście wyboru, jeśli instrukcja zawiera operator UNION, INTERSECT lub EXCEPT (SQL Server)

  5. Jak zastosować 3 wartości dla 1 wiersza do 3 wierszy z każdą wartością?