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

[SOLUCIONADO] Se agota el tiempo de semáforo al hacer un select

Estas en el tema de Se agota el tiempo de semáforo al hacer un select en el foro de SQL Server en Foros del Web. Hola, Resulta que al hacer consultas a una tabla, siempre me ha tardado demasiado en obtener los resultados. He estado mirado con la sorpresa de ...
  #1 (permalink)  
Antiguo 03/07/2012, 02:49
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Se agota el tiempo de semáforo al hacer un select

Hola,
Resulta que al hacer consultas a una tabla, siempre me ha tardado demasiado en obtener los resultados.
He estado mirado con la sorpresa de que no existe ningún Primary Key en dicha tabla, luego he intentado hacer lo siguiente:

1.- Crear una triple Primary Key (puesto que serían 3 campos los que no se deben repetir), pero no me ha dejado debido a que contiene datos duplicados y que no deberían estara ahí.

2.- Al ver dicho problema, he comprobado que efectivamente existen duplicados
Código:
SELECT e.A_codi,e.TA_codi,e.M_codi, COUNT(*)
FROM E_MODALIDAD e 
GROUP BY e.A_codi,e.TA_codi,e.M_codi 
HAVING COUNT(*) > 1
3.- Intento hacer una select de los que no hay duplicados, pero el sql server me corta la conexión
Código:
SELECT e.A_codi,e.TA_codi,e.M_codi, COUNT(*)
FROM E_MODALIDAD e 
GROUP BY e.A_codi,e.TA_codi,e.M_codi 
HAVING COUNT(*) = 1
El mensaje que me muestra al cortarse la conexión es el siguiente:
Código:
Msg 121, Level 20, State 0, Line 0
Error en el nivel del transporte al recibir los resultados del servidor. (provider: Proveedor de TCP, error: 0 - Se agotó el tiempo de espera del semáforo.)
¿Alguién sabe por qué puede ser? Tarda menos de un minuto en cortar la conexión y aparecer dicho mensaje.

Lo que necesito es quedarme sin duplicados... pero no puedo recorrer la tabla completa, ¿cómo podría comprobar de que dicha tabla no esté corrupta? ¿se podría aumentar el tiempo de espera? ¿alguién ha tenido dicho problema anteriormente??

Muchas gracias de antemano,
Saludos
  #2 (permalink)  
Antiguo 03/07/2012, 07:16
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: Se agota el tiempo de semáforo al hacer un select

porque no indexas tu tabla?? que es algo diferente a usar llaves primarias :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/07/2012, 09:50
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

He probado a indexar la tabla con éstos 3 campos de la tabla (A_codi, M_codi y TA_codi), puesto que éstos 3 campos son los que no se deberían repetir... que luego en la práctica si que se repiten... que es lo que tengo que corregir

El índice que se crea es el siguiente:
Código:
CREATE NONCLUSTERED INDEX [IX_EXCLUSION_MODALIDAD] ON [dbo].[EXCLUSION_MODALIDAD] 
(
	[A_codi] ASC,
	[M_codi] ASC,
	[TA_codi] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
Si repito la misma SELECT, mejora mostrándose más resultados (algo más de 100.000 registros), aunque también corta la conexión.

¿Estoy haciendo algo mal al crear el índice??
Si en la SELECT que necesito, voy a agrupar por estos 3 campos (A_codi, TA_codi, M_codi) para conseguir los no repetidos, puesto que son los que deberían ser únicos...
debería crear el índice con dichos 3 índices, ¿verdad?

Mil gracias de antemano!!
Saludos

Cita:
Iniciado por Libras Ver Mensaje
porque no indexas tu tabla?? que es algo diferente a usar llaves primarias :)
  #4 (permalink)  
Antiguo 03/07/2012, 13:46
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: Se agota el tiempo de semáforo al hacer un select

¿De cuantos registros en TOTAL estamos hablando?

Ahora bien, si tienes duplicados y tu sabes porque campos de duplican, ¿porque no los eliminas?
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 04/07/2012, 02:10
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

Hola de nuevo,

Al intentar hacer el SELECT de todos los registros me corta la conexión, aunque si me deja hacer el SELECT COUNT(*) y en total son 142599 registros. ¿Es normal que corte la conexión con éste número de registros?

Lo más sencillo es como me has dicho, borrar los registros repetidos puesto que hay pocos, y una vez que los tengo borrados, añadírselos sólo una vez.
Una vez ésto, borrar el antiguo índice y crearlo de nuevo, que así, al no tener duplicados, si que se notará irá bien el índice.

Pues intento borrar los registros repetidos, que son 14, pero no sé como borrarlos de forma automática, ésta vez, al ser pocos, lo he borrado uno a uno.

He intentado borrarlos de forma automática de la siguiente manera que muestro abajo, no me da ningún error de sintaxis, pero no me consigue borrar ningún registro :(

Código:
DELETE e
FROM EXCLUSION_MODALIDAD e
INNER JOIN(
	SELECT e.A_codi,e.TA_codi,e.M_codi
	FROM EXCLUSION_MODALIDAD e 
	GROUP By e.A_codi,e.TA_codi,e.M_codi 
	Having Count(*) > 1
)q
ON q.A_codi = e.A_codi and q.TA_codi=e.TA_codi and e.M_codi=q.TA_codi
where q.A_codi = e.A_codi and q.TA_codi=e.TA_codi and e.M_codi=q.TA_codi
en "q" tengo los registros que están repetidos y quiero borrar,
luego hago el DELETE de la tabla con un INNER JOIN a los registros que quiero borrar ??

¿Qué estoy haciendo mal para que no me borre ningún registro??

Mil gracias de nuevo por toda vuestra ayuda!!!
Saludos

Última edición por ros0809; 04/07/2012 a las 02:30
  #6 (permalink)  
Antiguo 04/07/2012, 08:12
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

Hola,
Pongo un ejemplo con pocos datos para ver si se ve entiende mejor.

Aquí creo una tabla temporal con 2 elementos duplicados
Código:
DECLARE @Tbl_datos TABLE (A_codi int, TA_codi int, M_codi int)
INSERT INTO @Tbl_datos VALUES (22360,83,88)
INSERT INTO @Tbl_datos VALUES (26526,89,28)
INSERT INTO @Tbl_datos VALUES (26526,89,32)
INSERT INTO @Tbl_datos VALUES (26526,89,33)
INSERT INTO @Tbl_datos VALUES (26526,89,35)
INSERT INTO @Tbl_datos VALUES (26526,89,38)
INSERT INTO @Tbl_datos VALUES (26526,89,47)
INSERT INTO @Tbl_datos VALUES (26526,89,69)
INSERT INTO @Tbl_datos VALUES (26526,89,72)
INSERT INTO @Tbl_datos VALUES (26526,89,107)
INSERT INTO @Tbl_datos VALUES (26526,89,145)
INSERT INTO @Tbl_datos VALUES (26526,89,153)
INSERT INTO @Tbl_datos VALUES (26526,89,165)
INSERT INTO @Tbl_datos VALUES (26526,89,211)
INSERT INTO @Tbl_datos VALUES (26526,89,28)
INSERT INTO @Tbl_datos VALUES (26526,89,32)
Con ésto, consigo tener un campo que me dirá el número de apariciones dentro de la tabla
Código:
SELECT  *, ROW_NUMBER() OVER (PARTITION BY  A_codi, TA_codi, M_codi ORDER BY A_codi) AS counter
FROM    @Tbl_datos
Y con ésto, consigo eliminar los repetidos, de tal manera que sólo me quedo con los que son distintos, esto es, counter =1. (Con una tabla temporal no me funciona, pero si que funciona creándolo en una tabla normal)
Código:
WITH q AS
(
    SELECT  *, ROW_NUMBER() OVER (PARTITION BY  A_codi, TA_codi, M_codi ORDER BY A_codi) AS counter
    FROM    @Tbl_datos
)
DELETE
FROM    q
WHERE   counter > 1
El problema que tengo, es que el código anterior, para poder eliminar los repetidos, me recorre toda la tabla, y en la tabla que tengo, llamada EXCLUSION_MODALIDAD que contiene 142599 registros, me corta la sesión (se agota el tiempo de semáforo).

¿Se os ocurre alguna forma más óptima de poder eliminar los duplicados sin recorrer toda la tabla?
A mí se me ocurre algo así de éste estilo... pero no va bien..

Código:
DELETE e
FROM EXCLUSION_MODALIDAD e
INNER JOIN(
	SELECT e.A_codi,e.TA_codi,e.M_codi
	FROM EXCLUSION_MODALIDAD e 
	GROUP By e.A_codi,e.TA_codi,e.M_codi 
	Having Count(*) > 1
)q
ON q.A_codi = e.A_codi and q.TA_codi=e.TA_codi and e.M_codi=q.TA_codi
where q.A_codi = e.A_codi and q.TA_codi=e.TA_codi and e.M_codi=q.TA_codi
¿Alguna sugerencia??
Gracias de antemano.
Saludos
  #7 (permalink)  
Antiguo 04/07/2012, 09:21
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: Se agota el tiempo de semáforo al hacer un select

¿No estas trabajando directamente en tu servidor?, ¿O te estas conectando a travez de algo hacia tu base de datos?
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 04/07/2012, 09:51
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

Estoy trabajando directamente desde el servidor, aún así, con 142599 registros el SQL Server cuando le hago la petición me corta la conexión :(
Tengo tablas mucho mayores y en cambio si que me permite recorrerlas... no se como podría comprobar de que dicha tabla no está corrupta.

¿¿Alguna idea de como poder eliminar registros repetidos?? ¿ó como poder comprobar que no está corrupta?
Mil gracias por todo!!
Saludos

Cita:
Iniciado por iislas Ver Mensaje
¿No estas trabajando directamente en tu servidor?, ¿O te estas conectando a travez de algo hacia tu base de datos?

Última edición por ros0809; 04/07/2012 a las 09:59 Razón: ampliar información
  #9 (permalink)  
Antiguo 04/07/2012, 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: Se agota el tiempo de semáforo al hacer un select

Eliminar registros repetidos de 10,000 en 10,000, ¿Te funciona?

WITH CTE (COl1,Col2, DuplicateCount)
AS
(
SELECT TOP 10000 COl1,Col2,
ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount
FROM DuplicateRcordTable
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
__________________
MCTS Isaias Islas
  #10 (permalink)  
Antiguo 05/07/2012, 01:43
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

Hola iislas!!!

Los registros que tenía repetidos al ser pocos los eliminé a mano, como ya no tenía repetidos, les puse la PRIMARY KEY para éstos 3 campos que deben ser únicos.

Para poder hacer la prueba, lo que he hecho es quitarle de nuevo la primary key de forma temporal, para así poder volver a meter valores duplicados. Le he añadido un par de datos repetidos, he probado lo que me has dicho, con el TOP 10000, para poder eliminar los 10.000 primeros registros y me ha funcionado perfectamente!!!

El código que me has comentado adaptándolo a mi caso ha sido el siguiente:

Código:
WITH CTE AS
(
	SELECT TOP 10000 A_codi, TA_codi, M_codi,
	ROW_NUMBER() OVER(PARTITION BY A_codi, TA_codi, M_codi ORDER BY A_codi) AS DuplicateCount
	FROM EXCLUSION_MODALIDAD
)
DELETE
FROM CTE
WHERE DuplicateCount > 1

De ésta forma elimino los duplicados que estén en los 10.000 primeros registros, ¿cierto?
Lo que he hecho a sido lo siguiente, lanzar el código anterior y he visto que ha eliminado registros duplicados dentro de los primeros 10.000 registros. Para confirmar de que no quedan ningún repetido más, he lanzado la consulta que puse anteriormente para todos los registros con duplicados, que funciona perfectamente sin cortar la conexión y he podido comprobar que ya no quedan duplicados.

Me surge una duda, en el caso hipotético de que estuviese en la posición 12.000 por poner un ejemplo, ¿Cómo podría encontrarlo? Esto es, ¿¿cómo podría volver a mirar si hay duplicados en los siguientes 10.000 registros?? ¿Existe alguna forma que no sea tener que ir moviendo dichos registros a otra tabla temporarl para así tener siempre los top 10.000 distintos? Es sólo por curiosidad.

Ya el problema que tenía eliminar los repetidos puesto que cortaba la conexión ya esta solucionada. Muchísimas gracias por vuestra ayuda!!


Saludos!!


Cita:
Iniciado por iislas Ver Mensaje
Eliminar registros repetidos de 10,000 en 10,000, ¿Te funciona?

WITH CTE (COl1,Col2, DuplicateCount)
AS
(
SELECT TOP 10000 COl1,Col2,
ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount
FROM DuplicateRcordTable
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
  #11 (permalink)  
Antiguo 05/07/2012, 11:04
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: Se agota el tiempo de semáforo al hacer un select

Esa rutina unicamente te traera DUPLICADOS, al colcar un TOP, es que acortas el resultado.

Quitale el TOP y ejecutala directamente.
__________________
MCTS Isaias Islas
  #12 (permalink)  
Antiguo 06/07/2012, 02:16
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

Me estaba complicando, ya está SOLUCIONADO,
Muchas gracias por vuestra ayuda!!!
Saludos!

Cita:
Iniciado por iislas Ver Mensaje
Esa rutina unicamente te traera DUPLICADOS, al colcar un TOP, es que acortas el resultado.

Quitale el TOP y ejecutala directamente.

Etiquetas: espera, server, sql
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 01:15.