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

Optimizar cursor

Estas en el tema de Optimizar cursor en el foro de SQL Server en Foros del Web. Hola gente: Tengo una tabla con columnas que indican clases para cada registro. tengo que obtener para cada registro, cuantas veces se repite cada clase. ...
  #1 (permalink)  
Antiguo 25/01/2010, 17:07
 
Fecha de Ingreso: diciembre-2002
Ubicación: argentina... de ahí seran veinte cuadras
Mensajes: 382
Antigüedad: 21 años, 4 meses
Puntos: 0
Optimizar cursor

Hola gente:

Tengo una tabla con columnas que indican clases para cada registro. tengo que obtener para cada registro, cuantas veces se repite cada clase.

armé este cursor que me resuelve el problema, pero tarda muchícimo. Alguna alternativa o forma de optimizarlo?

Código:
declare @id as int
declare @columna1 as varchar(50)
declare @columna2 as varchar(50)
declare @columna3 as varchar(50)
declare @columna4 as varchar(50)
declare @columna5 as varchar(50)
declare @columna6 as varchar(50)
declare @columna7 as varchar(50)
declare @columna8 as varchar(50)
declare @columna9 as varchar(50)
declare @columna10 as varchar(50)
delete from procesado

declare cur cursor for
select id, class0, class1, class2, class3, class4, class5, class6, class7, class8, class9 from total

    open cur
        -- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro
  fetch next from cur
  into @id, @columna1, @columna2, @columna3, @columna4, @columna5, @columna6,@columna7, @columna8, @columna9, @columna10 
      while @@fetch_status = 0
    begin
    
   BEGIN TRY
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna1,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna1
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna2,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna2
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna3,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna3
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna4,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna4
END CATCH
begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna5,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna5
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna6,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna6
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna7,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna7
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna8,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna8
END CATCH


begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna9,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna9
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna10,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna10
END CATCH

     
    -- Avanzamos otro registro
    fetch next from cur
   into @id, @columna1, @columna2, @columna3, @columna4, @columna5, @columna6,@columna7, @columna8, @columna9, @columna10
       end
    -- cerramos el cursor
        close cur
  deallocate cur

Muchas gracias desde ya
__________________
Juan Pablo
  #2 (permalink)  
Antiguo 25/01/2010, 17:46
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Optimizar cursor

Qué valores hay en tu tabla total?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 25/01/2010, 21:50
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: Optimizar cursor

hola, gracias por la respuesta.

La tabla tiene este formato:

id
clase1
clase2
clase3
claseN

necesito contar para cada registro cuantas clases tiene

un ejemplo de datos sería:

id : 1
clase1 : A
clase2 : A
clase3 : B
............


en este caso, quiero obtener una nueva tabla que contenga registros con la siguiente info:


1 | A | 2
1 | B | 1



gracias

Última edición por moron; 25/01/2010 a las 22:26
  #4 (permalink)  
Antiguo 26/01/2010, 09:27
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Optimizar cursor

optimizar y cursor deben ser utilizados con cuidado en una misma sentencia

y solo como comentario: Programar un flujo en base a excepciones no es lo mejor en ninguna plataforma que yo conozca.. ya que es costoso el manejo de las mismas...


adicional... creo que tu proceso puede ser replanteado en tres pasos, creando previamente una tabla adicional para almacenar la info a procesar, seria algo mas o menos asi..

Código:
INSERT INTO MyNewTable (nId, sClassName)
SELECT id, ClassName
(
	select id, class0, class1, class2, class3, class4, class5, class6, class7, class8, class9 
	from total 
) Classes
UNPIVOT
   (ClassName FOR ClassColumn IN (class0, class1, class2, class3, class4, class5, class6, class7, class8, class9 )
)AS unpvt;


UPDATE     P
SET        P.cantidad = P.cantidad + 1 
FROM       procesado  P
INNER JOIN MyNewTable M
ON         ID = nId and 
           clase= sClassName


INSERT INTO procesado (id,clase,cantidad)
SELECT     P.nId
          ,P.sClassName
          ,1
FROM       MyNewTable M
LEFT JOIN procesado P
ON         ID = nId and 
           clase= sClassName
WHERE      P.Id is null
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 26/01/2010, 09:57
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: Optimizar cursor

Si, es cierto que no se debe utilizar excepciones para esto, pero como es una aplicación que va a correr una sola vez y luego seguramente se descarte, busqué la opción mas sencilla. Pero lleva ya 7 horas ejecutando el proceso y sigue...

Esto que me estas planteando, si no entiendo mal es una forma de pasar cada columna a un registro cierto?
Estimo que es pseudo - código, y no logro hacerlo funcionar. Podrías por favor, detallarme que hace cada paso?

muchas gracias desde ya
  #6 (permalink)  
Antiguo 26/01/2010, 13:14
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Optimizar cursor

No es pseudocodigo, es codigo TSQL 2005 en adelante, solo me falto generar el script para crear la tabla de paso...

Solo realiza :

- La conversion de la tabla de entrada a una tabla con la estructura de la tabla Proceso...para esto hay mucha info en google..

- Luego actualiza los registros existentes

- Al final inserta los registros nuevos..

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 27/01/2010 a las 07:20
  #7 (permalink)  
Antiguo 27/01/2010, 06:58
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: Optimizar cursor

Listo.

Muchicimas gracias

Etiquetas: cursor
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:00.