IGNORE_DUP_KEY = ON
básicamente le dice a SQL Server que inserte filas que no sean duplicadas, pero ignora silenciosamente cualquier duplicado; el comportamiento predeterminado es generar un error y cancelar toda la transacción cuando hay duplicados en una columna que no los permite.¿Por qué NO deberías establecer IGNORE_DUP_KEY en ON?
He trabajado con una tonelada de datos que normalmente tiene al menos un duplicado cuando no debería haberlos, por lo que me gusta usar las restricciones UNIQUE
cuando sé que un valor no debería tener dups; sin embargo, cuando trato de cargar datos a granel, lo último que quiero es que se complete al 90% y de repente se ejecute un duplicado y se corrompe todo (sí, sé que la solución obvia es asegurarse de que no haya duplicados) , pero a veces me acaban de entregar una hoja de cálculo llena de datos y me dicen que la cargue lo antes posible).
Así que, ¿cuál es la razón para tener el valor por defecto será OFF
, y por qué no habría que quieren que sea en todo el tiempo de modo que las entradas no duplicados tienen éxito mientras que usted no tiene que preocuparse cualquier duplicado; lo más probable es que los duplicados estén ahí por error de todos modos.
¿Está relacionado con el rendimiento u otra cosa? Esto parece una gran idea, pero tiene que haber alguna razón por la cual no sea el comportamiento predeterminado.
Principalmente, ¿hay una buena razón no para utilizar esto de lo que debería tener conocimiento, o debería estar disponible para evaluar caso por caso?
Un comentario, configurar el ignorar NO tiene consecuencias. Si tiene una columna de identidad, verá omisiones en la identidad de cada inserción que se haya ignorado debido a un duplicado. –
Tener esta opción en índices no agrupados da una penalización en el rendimiento [Mantener índices únicos con IGNORE_DUP_KEY] (https://blogs.msdn.microsoft.com/craigfr/2008/01/30/maintaining-unique-indexes-with -ignore_dup_key /) y puede dar como resultado un bloqueo de rango severo con lotes de inserción simultáneos [Rango de bloqueo (RS-U) debido a la opción de índice IGNORE_DUP_KEY] (http://aboutsqlserver.com/tag/locking/). Por lo tanto, cuando desee insertar muchas filas de una sola vez e ignorar los duplicados, aplíquelo solo en la clave agrupada. – eremmel
@eremmel ¡Acabas de guardar mi tocino, gracias por ese comentario! He estado golpeándome la cabeza contra la pared durante los últimos días tratando de descubrir por qué estaba obteniendo bloqueos de Range sin aislamiento serializable cuando recibí este pequeño cosquilleo en mi cerebro sobre ignore_dup_key causando problemas de rendimiento. La búsqueda rápida me llevó a esta publicación, ¡rock! Solo desearía que esta fuera una respuesta completa, por lo que era más obvio :) –