Supongamos que tengo 2 tablas, Productos y Categorías de productos. Ambas tablas tienen relación en CategoryId. Y esta es la consulta.
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
Cuando creo un plan de ejecución, la tabla ProductCategories realiza la búsqueda de índice de clúster, que es lo que se espera. Pero para Table Products, realiza un escaneo de índice de clúster, lo que me hace dudar. ¿Por qué FK no ayuda a mejorar el rendimiento de las consultas?
Entonces tengo que crear un índice en Products.CategoryId. Cuando creo nuevamente el plan de ejecución, ambas tablas realizan la búsqueda de índice. Y el costo estimado del subárbol se reduce mucho.
Mis preguntas son:
Además de FK ayuda en la restricción de la relación, ¿tiene alguna otra utilidad? ¿Mejora el rendimiento de la consulta?
¿Debo crear un índice en todas las columnas FK (me gusta Products.CategoryId) en todas las tablas?
fuente
Foreign Keys puede mejorar (y dañar) el rendimiento
Como se indica aquí: las claves externas aumentan el rendimiento
Siempre debe crear índices en columnas FK para reducir las búsquedas. SQL Server no hace esto automáticamente.
Editar
Como el enlace ahora parece estar muerto (felicitaciones a Chris por darse cuenta) , a continuación se muestra la esencia de por qué las claves externas pueden mejorar (y dañar) el rendimiento.
La clave externa puede mejorar el rendimiento
fuente
Una clave foránea es un concepto DBMS para garantizar la integridad de la base de datos.
Cualquier implicación / mejora en el rendimiento será específica de la tecnología de la base de datos que se utilice y es secundaria al propósito de una clave externa.
Es una buena práctica en SQL Server asegurarse de que todas las claves externas tengan al menos un índice no agrupado en ellas.
Espero que esto te aclare las cosas, pero no dudes en solicitar más detalles.
fuente
Su mejor apuesta de rendimiento es usar Índices en los campos que usa con frecuencia. Si usa SQL Server, puede usar profiler para perfilar una base de datos específica y tomar el archivo que genera y usar el asistente de ajuste para recibir recomendaciones sobre dónde colocar sus índices. También me gusta usar el generador de perfiles para eliminar los procedimientos almacenados de larga ejecución, tengo una lista de los diez peores delincuentes que publico cada semana, hace que la gente sea honesta: D.
fuente
Puede usarlo para ayudar a que una consulta sea más eficiente. Le permite reestructurar las consultas en SQL Server para usar una combinación externa en lugar de una interna, lo que elimina la necesidad de tener que verificar si hay un valor nulo en la columna. No necesita poner ese calificador porque la relación de clave externa ya lo informa por usted.
Así que esto:
Se convierte en esto:
Esto no necesariamente generará un gran rendimiento en consultas pequeñas, pero cuando las tablas crecen, puede ser más eficiente.
fuente
Para MySQL 5.7, definitivamente puede acelerar las consultas que involucran múltiples combinaciones increíblemente bien.
Solía 'explicar' para entender mi consulta y descubrí que me unía a 4-5 tablas, donde no se usaban claves. No hice nada más que agregar una clave externa a estas tablas y el resultado fue una reducción del 90% en el tiempo de carga. Las consultas que tomaron> 5s ahora toman 500ms o menos.
¡Esa es una mejora ENORME!
Y, como otros han mencionado, obtienes la ventaja adicional de garantizar la integridad relacional.
Más allá de esto, garantizar la integridad referencial también tiene sus propios beneficios de rendimiento. Tiene el efecto de segundo orden de garantizar que las tablas que tienen la clave externa estén 'actualizadas' con la tabla externa. Supongamos que tiene una tabla de usuarios y una tabla de comentarios, y está haciendo algunas estadísticas en la tabla de comentarios. Probablemente, si eliminas al usuario por completo, tampoco quieres sus comentarios.
fuente
Agregar una clave externa en la tabla no mejorará el rendimiento, simplemente diciendo que si está insertando un registro en una base de datos de la tabla ProductCategories intentará encontrar que la columna de clave externa tiene un valor que existe en el valor de la clave primaria de una tabla de productos, esta búsqueda, la operación es una sobrecarga en su base de datos cada vez que agrega una nueva entrada en la tabla ProductCategories. Por lo tanto, al agregar una clave externa no mejorará el rendimiento de su base de datos, pero se ocupará de la integridad de su base de datos. Sí, mejorará el rendimiento de su base de datos si está verificando la integridad utilizando una clave externa en lugar de ejecutar muchas consultas para verificar que el registro existe en la base de datos de su programa.
fuente
No sé mucho sobre el servidor SQL, pero en el caso de Oracle, tener una columna de clave externa reduce el rendimiento de la carga de datos. Esto se debe a que la base de datos necesita verificar la integridad de los datos para cada inserción. Y sí, como ya se mencionó, tener un índice en la columna de clave externa es una buena práctica.
fuente
A partir de SQL Server 2008, las claves externas pueden influir en el rendimiento al influir en la forma en que el motor de la base de datos elige optimizar la consulta. Consulte Star Join Heuristics en el siguiente artículo: https://technet.microsoft.com/en-us/library/2008.04.dwperformance.aspx
fuente