2010-02-23 10 views
24

Estoy haciendo todo lo posible para persuadir a mi jefe para que nos deje usar claves extranjeras en nuestras bases de datos, hasta ahora sin suerte.¿Hay un golpe de rendimiento grave para usar claves externas en SQL Server?

Afirma que cuesta una cantidad significativa de rendimiento, y dice que solo tendremos trabajos para limpiar las referencias no válidas de vez en cuando.

Obviamente, esto no funciona en la práctica, y la base de datos está inundada de referencias no válidas.

¿Alguien sabe de una comparación, punto de referencia o similar que demuestre que no hay un rendimiento significativo para el uso de claves externas? (Que espero le convencerá)

+3

Solo una actualización de la historia completa: ahora se nos ha permitido usar claves foráneas, con la idea de que pueden deshabilitarse, si resultan en una pérdida de rendimiento. Así que gracias a todos por sus buenos puntos :-) – Steffen

Respuesta

29

Hay un pequeño impacto en el rendimiento de las inserciones, actualizaciones y eliminaciones porque debe confirmarse el FK. Para un registro individual, esto normalmente sería tan leve como para ser imperceptible, a menos que comience a tener un número ridículo de FK asociadas a la tabla (Claramente, se necesita más tiempo para verificar otras 100 tablas que 2). Esto es algo bueno, no malo, ya que las bases de datos sin integridad no son confiables y, por lo tanto, inútiles. No debe cambiar la integridad por la velocidad. Ese impacto en el rendimiento generalmente se compensa con una mejor capacidad para optimizar los planes de ejecución.

Tenemos una base de datos de tamaño medio con alrededor de 9 millones de registros y FK donde deberían estar y rara vez notamos un golpe de rendimiento (excepto en una tabla mal diseñada que tiene más de 100 claves externas, es un poco lento borrar registros de esto ya que todo debe ser verificado). Casi todos los dba que conozco que tratan con grandes bases de datos de tamaño de terabyte y una verdadera necesidad de alto rendimiento en grandes conjuntos de datos insisten en restricciones de clave externa porque la integridad es clave para cualquier base de datos. Si las personas con bases de datos del tamaño de un terabyte pueden permitirse el golpe de rendimiento muy pequeño, entonces tú también puedes.

Los FK no se indexan automáticamente y, si no se indexan, pueden ocasionar problemas de rendimiento.

Honestamente, tomaría una copia de su base de datos, agregaría FK correctamente indexadas y mostraría la diferencia de tiempo para insertar, borrar, actualizar y seleccionar de esas tablas en comparación con las mismas de su base de datos sin las FK. Demuestra que no estarás causando un golpe de rendimiento. A continuación, muestre los resultados de las consultas que muestran registros huérfanos que ya no tienen significado porque el PK con el que están relacionados ya no existe. Es especialmente efectivo mostrar esto para las tablas que contienen información financiera ("Tenemos 2700 pedidos que no podemos asociar con un cliente" harán que la administración se levante y tome nota).

+6

Información muy útil. Actualmente estoy agregando claves externas a una copia de la base de datos, sin embargo lleva algo de tiempo, ya que primero tengo que eliminar 20-30 millones de filas no válidas. Esto simplemente demuestra cuán grande era el problema de la falta de llaves en primer lugar. – Steffen

+0

"No debe cambiar la integridad por la velocidad"; sin embargo, eso es lo que hacen la mayoría de las bases de datos NoSql ... En algunos casos podría valer la pena la compensación, pero uno debe comparar seriamente el efecto real antes de realizar esa llamada. – noocyte

+0

@noocyte y es por eso que las bases de datos NoSql generalmente no son aptas para aplicaciones comerciales serias, especialmente en industrias reguladas como finanzas y atención médica. – HLGEM

16

De Microsoft Patterns and Practices: Chapter 14 Improving SQL Server Performance:

Cuando las claves primarias y externas se definen como limitaciones en el esquema de base de , el servidor puede usar esa información para crear óptimas planes de ejecución .

+2

seguro, puede usar esos índices para optimizar ... pero eso no significa automáticamente que no haya un impacto negativo en el rendimiento. Creo que hay demasiados factores involucrados para poner esta pregunta a dormir con esta referencia. –

+0

@Roland: Entiendo tu punto, y estoy de acuerdo contigo. Sin embargo, mi intención era abordar la parte de la pregunta "Estoy haciendo lo mejor para persuadir a mi jefe". –

+1

@Roland: Además, el golpe de rendimiento rara vez es grave. Como dijo en su respuesta, es difícil reclamar sin conocimiento de la aplicación, pero en la práctica los beneficios de las claves extranjeras rara vez se negocian por el rendimiento. Publicación SO relacionada: http: // stackoverflow.com/questions/1744878/can-foreign-keys-hurt-query-performance/ –

3

Está bien preocuparse por el rendimiento, pero no es una decisión paranoica.

Puede escribir fácilmente el código de referencia para mostrar los resultados usted mismo, pero primero tendrá que averiguar qué rendimiento le preocupa a su jefe y detallar exactamente esas métricas.

Por lo que respecta a las referencias no válidas, si no permite valores nulos en sus claves externas, no obtendrá referencias no válidas. La base de datos emitirá si intenta asignar una clave externa no válida que no existe. Si necesita "valores nulos", asigne una clave para que sea "INDEFINIDA" o algo así, y haga que esa sea la clave predeterminada.

Finalmente, explique a su jefe los problemas de normalización de la base de datos, porque creo que rápidamente encontrará que este problema será más problemático que el rendimiento de una clave foránea.

+0

Estoy bastante seguro de que no es una métrica de rendimiento exacta lo que le preocupa, ya que solo dice "duele el rendimiento" y eso es todo. Obviamente, esto no hace que sea más fácil probar que está equivocado :-( – Steffen

+1

Si alguien necesita "nulls" puede tener columnas anulables, no creará problemas en FK. Encuentro la técnica de agregar "null rows" personalizados. en tablas primarias para no agregar una columna que admite nulos en la tabla externa es peor que no usar FKs. –

+0

Si no tiene FK, entonces no permitir nulos en la columna FK no hace nada para evitar que ingrese un FK. inválido. Y no es hombre que el registro no se quedará huérfano si el registro PK original se elimina o cambia. – HLGEM

4

¿Alguien sabe de una comparación, de referencia o similar que demuestra que no hay un rendimiento significativo golpe a la utilización de claves externas? (Lo cual espero que lo convenza)

Creo que esto va por el camino equivocado. Los puntos de referencia nunca convencen a nadie.

Lo que debe hacer, primero es descubrir los problemas que resultan de no usar restricciones de clave externa. Intenta cuantificar cuánto cuesta el trabajo para "limpiar las referencias inválidas". Además, intente y calcule cuántos errores resultan en el proceso comercial debido a estos errores. Si puede adjuntar un monto en dólares a eso, incluso mejor.

Ahora para un punto de referencia: debe intentar obtener una idea de su carga de trabajo e identificar qué tipo de operaciones se realizan con más frecuencia. Luego configure un entorno de prueba y vuelva a ejecutar esas operaciones con las claves externas en su lugar. Entonces compare.

Personalmente, no afirmaría de inmediato sin el conocimiento de las aplicaciones que se ejecutan en la base de datos que las claves externas no cuestan rendimiento. Especialmente si tiene eliminaciones en cascada y/o actualizaciones en combinación con claves primarias naturales compuestas, personalmente personalmente temeré problemas de rendimiento, especialmente las transacciones con tiempo de espera o bloqueado debido a los efectos colaterales de las operaciones en cascada.

Pero nadie puede decirte, tienes que ponerte a prueba, con tus datos, tu carga de trabajo, tu número de usuarios concurrentes, tu hardware, tus aplicaciones.

+0

Buen punto acerca de la aplicación, sin embargo, las tablas son realmente simples: todas las claves principales son identidades, y tenemos no hay eliminación en cascada/actualizaciones. Así que, básicamente, es tan simple como se pone :-D – Steffen

+0

Steffen, que es información útil. Probablemente no tenga ninguna reserva, a menos que se trate de cargas masivas de escritura –

+0

Creo que estamos leyendo mucho más que escribiendo, así que esto tampoco debería ser un gran problema. Gracias por el comentario :-) – Steffen

1

Un factor significativo en el costo sería el tamaño del índice al que hacen referencia las claves externas: si es pequeño y se utiliza con frecuencia, el impacto en el rendimiento será insignificante, los índices grandes y menos utilizados tendrán más impacto, pero si la clave externa está en contra de un índice agrupado, aún así no debería ser un gran éxito, pero @Ronald Bouman tiene razón, debe probar para estar seguro.

6

Esto es más un problema político que uno técnico. Si la gestión de su proyecto no ve ningún valor para mantener la integridad de sus datos, debe estar en un proyecto diferente.

Si su jefe aún no sabe o no le preocupa que tenga miles de referencias no válidas, no va a comenzar a preocuparse solo porque usted se lo cuente. Me solidarizo con los otros carteles que están tratando de instarlo a hacer lo "correcto" peleando la buena batalla, pero lo he intentado muchas veces antes y en la práctica real no funciona. La historia de David y Goliat es buena para leer, pero en la vida real es una propuesta perdedora.

+1

Estoy de acuerdo con @Dave aquí, pero te animo a seguir peleando la buena batalla de todos modos. Es desafortunado que a veces la gerencia tenga temores sobre cosas que ellos (claramente, aunque lo decimos en voz baja) no entienden. Esto les cuesta a las empresas no solo en dólares el tiempo dedicado a rectificar problemas que no tenían que haber ocurrido en primer lugar, sino que desalienta la creatividad y las soluciones dinámicas de las personas que están realmente mejor equipadas para diseñar esas soluciones. Retengo la actitud de "nunca digas morir", hasta que se da o se rechaza una prueba sólida ... para gran irritación de mis superiores ... –

Cuestiones relacionadas