Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Entity Framework Индексиране на ВСИЧКИ колони с външен ключ

В EF Code First общата причина, поради която бихте моделирали връзка с външен ключ, е възможността за навигация между обекти. Помислете за прост сценарий на Country и City , с нетърпеливо зареждане, дефинирано за следния LINQ оператор:

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

Това ще доведе до заявка по следния начин:

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

Без индекс на външния ключ на City.CountryId , SQL ще трябва да сканира таблицата Cities, за да филтрира градовете за страната по време на JOIN.

FK индексът също така ще има предимства в производителността, ако редовете бъдат изтрити от родителската таблица Държава, тъй като референтната цялост ще трябва да открие наличието на всички свързани редове за град (независимо дали FK има ON CASCADE DELETE определени или не).

TL;DR

Индекси на външни ключове са препоръчително , дори ако не филтрирате директно външния ключ, той пак ще е необходим в Joins. Изключенията от това изглеждат доста измислени:

  • Ако селективността на външния ключ е много ниска, напр. в горния сценарий, ако 50% от ВСИЧКИ градове в таблицата с държави са в Япония, тогава индексът не би бил полезен.

  • Ако всъщност никога не навигирате през връзката.

  • Ако никога не изтриете редове от родителската таблица (или опитате да актуализирате на PK) .

Едно допълнително съображение за оптимизиране е дали да се използва външният ключ в Clustered Index на дъщерната таблица (т.е. клъстерни градове по държави). Това често е от полза при релации родителски:дъщерни таблици, където е обичайно да се извличат всички дъщерни редове за родителя едновременно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо използването на знак за долна черта във филтър LIKE ми дава всички резултати?

  2. Обединяване на данни от 2 таблици

  3. Съхраняване на единични кавички в променлива varchar SQL Server 2008

  4. 7 начина за връщане на всички таблици с първичен ключ в SQL Server

  5. Защо получавам Невалиден опит за извикване на HasRows, когато четецът е затворен с отворена връзка?