sql >> Database teknologi >  >> RDS >> Sqlserver

Entity Framework Indeksering af ALLE fremmednøglekolonner

I EF Code First er den generelle grund til, at du vil modellere et udenlandsk nøgleforhold, for navigerbarheden mellem enheder. Overvej et simpelt scenario med Country og City , med ivrig indlæsning defineret for følgende LINQ-sætning:

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

Dette ville resultere i en forespørgsel i stil med:

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

Uden et indeks på fremmednøglen på City.CountryId , skal SQL scanne tabellen Byer for at filtrere byerne for landet under en JOIN.

FK-indekset vil også have performancefordele, hvis rækker slettes fra den overordnede lande-tabell, da referenceintegritet skal registrere tilstedeværelsen af ​​eventuelle sammenkædede byrækker (om FK har ON CASCADE DELETE defineret eller ej).

TL;DR

Indekser på udenlandske nøgler er anbefales , selvom du ikke filtrerer direkte på fremmednøglen, vil den stadig være nødvendig i Joins. Undtagelserne fra dette ser ud til at være ret konstruerede:

  • Hvis fremmednøglens selektivitet er meget lav, f.eks. i ovenstående scenarie, hvis 50 % af ALLE byer i landetabellen var i Japan, ville indekset ikke være nyttigt.

  • Hvis du faktisk aldrig navigerer på tværs af forholdet.

  • Hvis du aldrig sletter rækker fra den overordnede tabel (eller forsøger at opdatere på PK'en) .

En yderligere optimeringsovervejelse er, om den fremmede nøgle skal bruges i Clustered Index af den underordnede tabel (dvs. klynge byer efter land). Dette er ofte fordelagtigt i forhold til overordnede :underordnede tabelrelationer, hvor det er almindeligt sted at hente alle underordnede rækker for forælderen samtidigt.



  1. Udnytte kraften i klynger i forbindelse med databaser?

  2. ODP.NET Hvordan overfører man række af strenge til en Oracle Stored-procedure?

  3. hvordan man opretter dynamisk tabel i Oracle med dynamisk kolonnenavn og dynamisk datatype uden nogen visninger eller enhver anden tabeltype

  4. indlæs data lokal infil FEJL 2 fil blev ikke fundet