Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Tablas con índices y opción IGNORE_DUP_KEY=ON

Estas en el tema de Tablas con índices y opción IGNORE_DUP_KEY=ON en el foro de SQL Server en Foros del Web. Hola, Tengo una aplicación en SQL Server 2008 con varias tablas que tienen índices únicos con la opción IGNORE_DUP_KEY=ON que me permite insertar masivamente datos ...
  #1 (permalink)  
Antiguo 12/11/2013, 14:30
 
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 10 años, 5 meses
Puntos: 0
Pregunta Tablas con índices y opción IGNORE_DUP_KEY=ON

Hola,

Tengo una aplicación en SQL Server 2008 con varias tablas que tienen índices únicos con la opción IGNORE_DUP_KEY=ON que me permite insertar masivamente datos desde otras fuentes sin provocar errores de duplicados del índice. Sin embargo esta opción del índice me da problemas a la hora de realizar inserciones en una tabla desde diferentes transacciones que hacen los diferentes usuarios. Por ejemplo un usuario agrega un registro a una tabla en cuestión dentro de una transacción y hasta que no se termina la transacción otros usuarios no pueden insertar registros en esa tabla por que se encuentra bloqueada. ¿Como puedo solucionar este problema?

Saludos,

José Antonio Muñoz
  #2 (permalink)  
Antiguo 12/11/2013, 15:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

cual es el error que te manda cuando esta bloqueada la tabla, ya revisaste informacion sobre los niveles de aislamiento de sql server??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 13/11/2013, 02:20
 
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Hola Libras,

el error que aparece es: "Superado el tiempo de espera de solicitud de bloqueo". En cuanto a lo que me comentas, ya revisé los diferentes niveles de aislamiento, he probado con la configuración TRANSACTION ISOLATION LEVELS de diferentes maneras pero no he conseguido nada. Ten en cuenta que he creado una tabla de ejemplo:

CREATE TABLE Tabla (Codigo Int, Fecha Date);
CREATE UNIQUE NONCLUSTERED INDEX X_Prueba ON Tabla (Codigo) WITH (IGNORE_DUP_KEY=ON);

En dos sesiones diferentes:

Sesión 1:
BEGIN TRAN
INSERT Tabla VALUES (1,'01/01/2013')

Resultado: 1 Registro actualizado

Sesión 2:
BEGIN TRAN
INSERT Tabla VALUES (2,'02/01/2013')

(al cabo de un buen rato)
Error: Superado el tiempo de espera de solicitud de bloqueo


Esto mismo lo hago pero cambio la opción: IGNORE_DUP_KEY=OFF

Sesión 1:
BEGIN TRAN
INSERT Tabla VALUES (1,'01/01/2013')

Resultado: 1 Registro actualizado

Sesión 2:
BEGIN TRAN
INSERT Tabla VALUES (2,'02/01/2013')

Resultado: 1 Registro actualizado

Saludos,
José Antonio Muñoz

Última edición por JoseAntonioM; 13/11/2013 a las 02:50
  #4 (permalink)  
Antiguo 13/11/2013, 09:12
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

a ver, si tienes un campo unique se supone que va a tener valores unicos cierto? pero en este caso necesitas que se inserten valores duplicados entonces para que el unique? no podrias simplemente crear el indice sobre ese campo sin el unique??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 14/11/2013, 01:48
 
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Hola,

claro que necesito que sea un índice único, por eso tengo la opción IGNORE_KEY_DUP=ON, por que en las operaciones masivas de inserción si existen claves duplicadas, solo guardar una de ellas descartando las otras duplicadas pero no me da error. El índice tiene que ser único, no pueden existir dos registros con esa misma clave.

Saludos,
José Antonio Muñoz
  #6 (permalink)  
Antiguo 14/11/2013, 08:42
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

si tienes ese problema, porque no primero cargas tus inserciones masivas en una tabla "temporal"(al decir temporal me refiero a una tabla nada mas para las cargas que se elimine la info antes de cargar) y despues de esa tabla temporal nada mas obtienes los registros no duplicados, asi te ahorras este tipo de problemas :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 14/11/2013, 12:40
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Mucho mejor si usas SSIS para insertar tus registros, ya que ahí, si puedes decidir que hacer con los duplicados....
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 14/11/2013, 13:43
 
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Lo siento chicos pero no puedo hacer lo que me aconsejais ya que tengo que insertar unas 120 tablas con una media de 12000 registros cada una de ellas y no puedo hacerlo con una tabla temporal ya que tardaría mucho tiempo de procesar la migración de datos y además el proceso, que es bastante complejo, ya está construido y no puedo rehacerlo todo de nuevo.

gracias por vuestra colaboración, pero necesito otra manera más sencilla de resolver este problema sin tener que eliminar el indice único con la opción IGNORE_DUP_KEY=ON. Me han hablado de cambiar el tipo de índice único que actualmente es NONCLUSTERED por CLUSTERED, es decir, agrupar el índice y por lo visto no da errores de bloqueo de tabla. Sin embargo ya tengo una clave principal que es PK y además está agrupada y por lo visto no se puede crear más de 1 clave agrupada por tabla. ¿sabéis algo de esto? ¿que problemática habría si la clave principal PK la convierto en desagrupada (NONCLUSTERED) y la clave única la convierto en agrupada (CLUSTERED)?.

Saludos,
José Antonio Muñoz
  #9 (permalink)  
Antiguo 14/11/2013, 14:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

estas hablando de cosas diferentes, en una tabla puedes tener un solo indice cluster y varios noncluster, un indice cluster si mal no recuerdo es el ordenamiento principal de tus datos y un noncluster son los ordenamientos secundarios(en una busquedad primero iria a a buscar sobre el indice cluster y despues sobre el noncluster) al crear una llave primaria se crea por default un noncluster, si te resuelve tu problema poniendo un indice noncluster en lugar de cluster parece perfecto :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 15/11/2013, 12:59
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Un índice con IGNORE DUPLICATES, tiene el objetivo de IMPEDIR que el contenido de ese campo se REPITA, independientemente del PK
__________________
MCTS Isaias Islas
  #11 (permalink)  
Antiguo 18/11/2013, 07:24
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Cita:
Iniciado por iislas Ver Mensaje
Un índice con IGNORE DUPLICATES, tiene el objetivo de IMPEDIR que el contenido de ese campo se REPITA, independientemente del PK
Hola iislas, la característica IGNORE DUPLICATES cumple la función de una restricción del tipo UNIQUE? como se setea dicha opción?

Gracias

damimg
  #12 (permalink)  
Antiguo 19/11/2013, 12:32
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Se SETEA cuando se crea el índice y un ejemplo sencillo seria:

Tabla EMPLEADOS

IDEmpleado PK
NSS (Numero de Seguro Social), Indice (ignore duplicates)
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 19/11/2013, 16:19
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Cita:
Iniciado por iislas Ver Mensaje
Se SETEA cuando se crea el índice y un ejemplo sencillo seria:

Tabla EMPLEADOS

IDEmpleado PK
NSS (Numero de Seguro Social), Indice (ignore duplicates)
Podrias traducirlo a codigo DML iislas? gracias
  #14 (permalink)  
Antiguo 20/11/2013, 11:02
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Código SQL:
Ver original
  1. CREATE UNIQUE INDEX AK_UnitMeasure_Name
  2.     ON Production.UnitMeasure(Name);
  3. GO
__________________
MCTS Isaias Islas
  #15 (permalink)  
Antiguo 20/11/2013, 12:02
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Tablas con índices y opción IGNORE_DUP_KEY=ON

Cita:
Iniciado por iislas Ver Mensaje
Código SQL:
Ver original
  1. CREATE UNIQUE INDEX AK_UnitMeasure_Name
  2.     ON Production.UnitMeasure(Name);
  3. GO
Entonces estas definiendo un indice Unique!! yo pense que habia un seteo denominado IGNORE_DUP_KEY=ON

Etiquetas: registro, server, sql, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:13.