2009-11-16 13 views
15

Según comprendí del this post, existen algunos casos en los que las claves externas pueden mejorar el rendimiento de las consultas.¿Pueden las claves foráneas dañar el rendimiento de la consulta?

He oído la afirmación opuesta, sin embargo, que debido a las comprobaciones de integridad referencial, las claves externas en realidad pueden dañar el rendimiento de la consulta. ¿En qué condiciones (si es que lo es) es así?


1) El término consulta parece ser engañoso. Estoy interesado en todo tipo de sanciones de rendimiento.

2) ¿Alguien tiene números del mundo real sobre el impacto negativo en las instrucciones INSERTAR, ELIMINAR o ACTUALIZAR (sé que depende del sistema específico, pero sin embargo, se apreciarían cualquier tipo de mediciones del mundo real)?

+3

Por "consulta", ¿quiere decir SELECCIONAR? Porque creo que las verificaciones de integridad referencial solo afectarían a INSERT/UPDATE/DELETE en términos de rendimiento. –

Respuesta

11

Supongo que para las consultas INSERT, las restricciones, incluidas las restricciones de clave externa, ralentizarán un poco el rendimiento. La base de datos debe verificar que lo que sea que le haya indicado que inserte es algo que sus restricciones le permiten insertar.

Para consultas SELECT, las restricciones de clave externa no deberían hacer ningún cambio en el rendimiento.

Dado que los INSERTOS son casi siempre muy rápidos, la pequeña cantidad de tiempo extra no será perceptible, excepto en casos adicionales. (Creando una base de datos de varios gigabytes, es posible que desee deshabilitar las restricciones y luego volver a habilitarlas más adelante, siempre que esté seguro de que los datos son buenos)

4

Las claves foráneas pueden causar inserciones (o algunas actualizaciones) en las tablas secundarias o elimina de las tablas principales para tomar más tiempo. Sin embargo, esto es bueno, ya que significa que se está asegurando de que la integridad de los datos permanece. No hay ninguna razón para omitir el uso de claves foriegn a menos que no desee tener datos útiles. Normalmente no notará mucha diferencia a menos que tenga muchas claves foráneas creadas en la misma tabla primaria o si está insertando o eliminando muchos registros en un lote. Además, he notado que los usuarios son más tolerantes con un par de segundos extra en una inserción o eliminación que en una selección. Los usuarios tampoco son tolerantes con datos no confiables, que es lo que tiene sin restricciones de clave externa.

Deberá indexarlos para mejorar el rendimiento en las consultas de selección.

2

Si las claves externas tuvieran algún impacto de esa manera, sería en INSERTS. La base de datos realiza la verificación referencial en claves externas cuando los registros se crean/modifican, no SELECCIONADOS.

0

Creo que la publicación destacó que poner un índice en campos FK mejoró el rendimiento, no simplemente que una relación FK mejoró el rendimiento. La existencia de un FK en una tabla no debería tener ningún efecto en una consulta SELECT, a menos que se realicen operaciones JOIN, en cuyo punto, la relación FK Y el índice en los campos FK mejorarían el rendimiento.

2

Las claves externas no afectarán negativamente el rendimiento de la consulta en la mayoría de los casos, y se recomiendan encarecidamente. Al ayudar a la normalización, eliminará los datos redundantes, y si hace un seguimiento agregando índices subyacentes (para la clave externa apropiada) obtendrá un buen rendimiento en sus consultas.

Las claves foráneas pueden ayudar al optimizador de consultas a obtener los mejores planes de consulta para una consulta determinada.

La comprobación de clave foránea es un factor cuando actualiza sus datos (que es una consideración separada - supongo que aquí su preocupación es la consulta - a menos que la palabra consulta implica ambos).

4

Para INSERTAR/ACTUALIZAR/ELIMINAR, la respuesta abreviada es "Sí". La base de datos deberá verificar que la integridad referencial esté intacta y que se permita la creación/modificación. O en el caso de DELETE, puede que haya que hacer una cascada.

Para SELECT, en realidad es todo lo contrario. Foreign Keys tiene un beneficio adicional secreto de mostrarle exactamente dónde es más probable que esté haciendo JOINs complejos y campos muy comúnmente utilizados. Esto hace que el trabajo de indexación sea mucho más fácil, y puede garantizar que todos sus campos FK deben ser indexados. Esto hace SELECTs mucho más rápido.

19

si se necesita una clave externa para la integridad referencial entonces la presencia de la clave externa debe formar la línea de base para un rendimiento

que también podría preguntar si un coche puede ir más rápido si usted no pone en asientos - un auto bien formado incluye asientos tanto como una base de datos bien formada incluye claves externas

5

En teoría, sí: las escrituras de datos deben validar las restricciones.

En la práctica, pocas veces: a menos que se mida y se demuestre lo contrario, puede suponer que no hay impacto en el rendimiento. En su gran mayoría, los problemas de rendimiento se producen debido a otros problemas:

  • mal diseño de esquema (índices que faltan, mala elección índice agrupado)
  • contención (bloqueo), de nuevo debido al diseño del esquema malo (recorridos de tablas garantizan conflictos de bloqueo)
  • mal diseño de la consulta

en un esquema bien diseñado y buenas consultas el costo de las restricciones comenzarán a aparecer en muy alto rendimiento. Cuando esto sucede, hay medidas preventivas.

Mi 2c: Nunca sacrifique las restricciones de corrección para algunos objetivos de rendimiento elusivos. En el muy raro caso en que las limitaciones son realmente el problema, hay medidas para mostrar que ese es el caso, y como dice el refrán: si tiene que preguntar cuánto cuesta, no puede pagarlo. Si tiene que preguntar si las limitaciones pueden ser un problema, no puede eliminarlas (sin intención de ofender).

+0

De acuerdo. Si bien el rendimiento es realmente importante para las bases de datos, nunca debe prevalecer sobre la integridad de los datos. ¿Cuál es la necesidad de insertar rápidamente datos no confiables? – HLGEM

0

Si está aplicando integridad referencial, los INSERTOS y las ACTUALIZACIONES que afectan al campo FK serán más lentos. Sin embargo, generalmente no es mucho de lo que preocuparse, especialmente porque muchos DB son 80% de lectura/20% de escritura. También es un precio que vale la pena pagar.

Crear un índice en una clave externa a menudo es beneficioso, aunque obviamente depende de qué sentencias de SELECT esté ejecutando.

En general, necesita claves externas debido a la normalización (que evita la duplicación de datos y problemas de sincronización). Normalice hasta el tercer grado, y luego, después de analizar el rendimiento en el mundo real, puede considerar la desnormalización.

3

La comprobación de clave foránea lleva más tiempo de lo que piensa la mayoría de la gente. Una prueba actual con Oracle 11g y una tabla con dos claves externas mostraron que el tiempo para una inserción de aproximadamente 800,000 filas tomó 60 segundos con las teclas foráneas habilitadas pero solo 20 segundos sin claves externas. (Las columnas de clave externa se indexaron, por supuesto)

De todos modos, estoy de acuerdo con todos los demás carteles, que las restricciones de integridad no son una opción, sino la única forma de mantener la coherencia de los datos. Sin embargo, para las importaciones, especialmente en tablas vacías, podría ser una opción desactivar la clave externa para el momento de la importación, si el tiempo es crítico.

+0

En situaciones que impliquen un conjunto de inserciones masivas, las claves externas se pueden deshabilitar para la inserción y luego volver a habilitarlas después de la inserción. Un análisis de validez verificará que ningún valor insertado rompió las reglas. Si algunos lo hicieron, pueden tratarse individualmente, tendrían que ser de cualquier manera. –

0

Las claves externas ralentizan las inserciones y modificaciones, ya que cada referencia de clave externa debe verificarse. Las claves externas no pueden afectar una selección, o hacerla ir más rápido, dependiendo de si el DBMS utiliza indexación de clave externa.

Las claves externas tienen un efecto complejo en la eliminación. Si está eliminando lo que se refiere a la clave externa, no afectará nada, pero si lo que está eliminando está referenciado por una clave externa en otra fila/tabla, generalmente causará problemas.

Las claves foráneas pueden causar una degradación de rendimiento menor en las creaciones y modificaciones de la tabla.

Por supuesto, todo esto supone que se está utilizando la verificación de la clave externa.

Cuestiones relacionadas