2009-10-27 7 views
7

Estamos diseñando una base de datos en la que necesito considerar algunas restricciones FK (clave externa) . Pero no está limitado a estructuración formal y normalización. Lo intentamos solo si proporciona algún beneficio de escalabilidad o rendimiento de .SQL Server Foreign Key constraint benefits

He estado repasando algunos artículos interesantes y buscando beneficios prácticos en Google. Estos son algunos enlaces:

http://www.mssqltips.com/tip.asp?tip=1296

que quería saber más acerca de los beneficios de FK (aparte de la estructuración formal y el famoso en cascada eliminar \ update).

  • FK no están 'indexadas' de forma predeterminada, ¿cuáles son las consideraciones al indexar un FK?

  • Cómo controlar los campos anulables que se asignan como clave foránea - ¿está permitido?

  • Además de la indexación, ¿esto ayuda a optimizar los planes de ejecución de consultas en SQL-Server?

Sé que hay más, pero preferiría que los expertos hablen sobre esto. Por favor guíame.

Respuesta

9
  • Las claves foráneas no ofrecen ningún beneficio de rendimiento o escalabilidad.
  • Las claves externas imponen integridad referencial. Esto puede proporcionar un beneficio práctico al generar un error si alguien intenta eliminar filas de la tabla padre por error.
  • Las claves externas no están indexadas por defecto. Debe indexar las columnas de claves externas, ya que esto evita una exploración de tabla en la tabla secundaria cuando elimina/actualiza su fila padre.
  • Puede hacer que una columna de clave foránea sea nulable e insertar nulo.
+0

He estado manejando algunas bases de datos con unos pocos millones de registros. Mucho se trata de importar datos entre la base de datos y su clon y luego usar ese clon en el entorno de la aplicación web. Bueno, he sabido que mantener los índices PK automáticamente y por lo tanto ayuda a acelerar el acceso a los datos. Ahora, a partir de esta discusión, deduzco que si estoy usando JOINs en mis SQL-Queries, entonces shud use FK e indexe para hacer que las operaciones JOIN sean eficientes. –

+0

Por ejemplo, tengo una tabla OrgMaster (contiene todos los registros Org) luego tengo una tabla BookingMaster (contiene todos los registros de reservas). Ahora, el OrgMaster.Id está siendo 'referenciado' como BookingMaster.OrgId. Entonces, tengo un FK para la relación OrgId-to-Id y lo shud 'index' para un mejor rendimiento de cualquier operación JOIN entre estas dos tablas ... ¿lo obtuve correctamente?
Todo lo anterior, a costa de una sobrecarga adicional de espacio y tiempo (al insertar el registro en la tabla con FK). –

+0

Le solicitaría que me proporcione una lista de puntos para considerar, como - - ¿El FK-index va a consumir demasiado espacio \ tiempo a medida que la tabla crece unos pocos millones de registros? - En ese caso, ¿vale la pena ir por un índice FK "cada vez"? - ¿En qué caso shud NO aplico FK ni lo indexo o no hago nada de eso (por supuesto puedo manejar MUCHO desde la aplicación) - ¿Alguna otra complicada aceleración de JOIN u otras búsquedas tan lentas? –

6

El principal beneficio es que su base de datos no terminará siendo inconsistente si su código de cliente con errores intenta hacer algo mal. Las claves foráneas son un tipo de 'restricción', así que así es como debe usarlas.

No tienen ningún beneficio "funcional", no optimizarán nada. Aún tiene que crear índices usted mismo, etc. Y sí, puede tener valores NULOS en una columna que es una clave externa.

+1

No solo código de cliente con errores. Se sabe que los usuarios de "Buggy" y los administradores de bases de datos cometen errores al hacer una solución rápida escribiendo directamente los comandos de actualización de SQL. –

4

Las restricciones FK mantienen la coherencia de sus datos. Eso es. Este es el principal beneficio. Las restricciones de FK no le proporcionarán ninguna ganancia de rendimiento.

Pero, a menos que haya desnormalizado a propósito la estructura de db, le recomendaría usar restricciones de FK. La razón principal: consistencia.

1

Como se mencionó, son para la integridad de los datos. Cualquier "pérdida" de rendimiento sería aniquilada completamente por el tiempo requerido para arreglar los datos rotos.

Sin embargo, podría haber un beneficio de rendimiento indirecto.

Para SQL Server al menos, las columnas en el FK deben tener el mismo tipo de datos en cada lado. Sin un FK, podría tener un padre nvarchar y un niño varchar por ejemplo.Cuando se une a las 2 tablas, obtendrá conversiones de tipo de datos que pueden matar el rendimiento.

Example: different varchar lengths causing an issue

3

He leído al menos un ejemplo de red donde se demostró que las claves foráneas hacer mejorar el rendimiento porque el optimizador no tiene que hacer comprobaciones adicionales a través de tablas, ya que sabe de datos cumple con ciertos criterios ya debido al FK. Lo siento, no tengo un enlace, pero el blog dio un resultado detallado de los planes de consulta para probarlo.

Cuestiones relacionadas