sql >> Base de Datos >  >> RDS >> Sqlserver

Entity Framework Indexación de TODAS las columnas de clave externa

En EF Code First, la razón general por la que modelaría una relación de clave externa es la navegabilidad entre entidades. Considere un escenario simple de Country y City , con carga ansiosa definida para la siguiente instrucción LINQ:

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

Esto daría como resultado una consulta similar a:

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

Sin un índice en la clave externa en City.CountryId , SQL necesitará escanear la tabla Ciudades para filtrar las ciudades por País durante una UNIÓN.

El índice FK también tendrá beneficios de rendimiento si se eliminan filas de la tabla País principal, ya que la integridad referencial deberá detectar la presencia de cualquier fila de Ciudad vinculada (si el FK tiene ON CASCADE DELETE definido o no).

TL;RD

Índices en claves externas son recomendado , incluso si no filtra directamente en la clave externa, seguirá siendo necesaria en Joins. Las excepciones a esto parecen ser bastante artificiales:

  • Si la selectividad de la clave foránea es muy baja, p. en el escenario anterior, si el 50% de TODAS las ciudades en la tabla de países estuvieran en Japón, entonces el Índice no sería útil.

  • Si en realidad nunca navegas por la relación.

  • Si nunca elimina filas de la tabla principal (o intenta actualizar el PK).

Una consideración de optimización adicional es si usar la clave externa en el Clustered Index de la tabla secundaria (es decir, agrupar ciudades por país). Esto a menudo es beneficioso en las relaciones de tabla padre:hijo, donde es común recuperar todas las filas secundarias para el padre simultáneamente.