Problemas trabajando con Cursores en SQL Server 7.0

18/10/2006 - 16:37 por Hernan Rocca | Informe spam
Hola gente del foro, estaba teniendo un inconveniente cuando trabajo con
cursores para luego insertar esos datos en una tabla.
El problema es el siguiente, cuando ejecuto el script que realiza el insert
en una tabla vacia generalmente tarda unos segundos, pero bajo las mismas
condiciones (en maquina local, sin ningun usuario conectado, insert sobre
una tabla vacia) suele tardar varios minutos.
el cursor recorre unos 10000 o 20000 registros y luego los inserta en otra
tabla, pero hay veces que tarda mucho, mucho más que otras veces... esto se
puede deber a alguna configuración, como ser la base tempdb o la utilización
de la memoria o algo por el estilo, espero que me puedan guiar para ver el
motivo de este comportamiento, El codigo que utilizo por las dudas es el
siguiente:

DECLARE @_comp INT
DECLARE @_cont INT
DECLARE @_tcomp VARCHAR(2)
DECLARE @_femi DATETIME
DECLARE @_fven DATETIME
DECLARE @CANT INT
DECLARE @TOTAL INT

SET NOCOUNT ON
SET @TOTAL = 0

DECLARE lista CURSOR FOR
SELECT tipo_de_comprobante, numero_de_comprobante, codigo_de_contrato,
fecha_de_emision, fecha_de_vencimiento
FROM datcom
WHERE idusuario = 50
AND codigo_de_contrato <> 0

OPEN lista
FETCH lista INTO @_tcomp, @_comp, @_cont, @_femi, @_fven
WHILE @@fetch_status=0
BEGIN

INSERT INTO Fact_Cab (emp_codigo, suc_codigo, cte_tipo, fac_letra,
fac_numero, cont_numero, fac_fecha, fec_vto, total_cte_neto,
nro_recibo_merc, nro_recibo_iva, fac_facturado, mas_ingreso, mas_asiento,
nd_comp_comision, nd_vend_comision, cont_cerrado, total_iva_merc,
total_iva_otros, fac_fij_item, fac_detalle_modelo, total_neto_gravado,
total_neto_gravado_2, iva_porc, iva_porc_2, fac_cai, fac_cai_vto,
fac_barras, fac_pad_clie)
SELECT
emp_codigo = 6,
suc_codigo = 1,
cte_tipo = CASE @_tcomp
WHEN 'BD' THEN 28
WHEN 'BP' THEN 27
WHEN 'CR' THEN 32
WHEN 'CV' THEN 17
WHEN 'DC' THEN 14
ELSE ' '
END,
fac_letra = 'A',
fac_numero = @_comp,
cont_numero = @_cont,
fac_fecha = @_femi,
fec_vto = @_fven,
total_cte_neto = 0,
nro_recibo_merc = 0,
nro_recibo_iva = 0,
fac_facturado = NULL,
mas_ingreso = @_fven,
mas_asiento = 0,
nd_comp_comision = 0,
nd_vend_comision = 0,
cont_cerrado = NULL,
total_iva_merc = 0,
total_iva_otros = 0,
fac_fij_item = 0,
fac_detalle_modelo = NULL,
total_neto_gravado = 0,
total_neto_gravado_2 = 0,
iva_porc = 0,
iva_porc_2 = 0,
fac_cai = NULL,
fac_cai_vto = NULL,
fac_barras = NULL,
fac_pad_clie = 0
FETCH lista INTO @_tcomp, @_comp, @_cont, @_femi, @_fven
END
CLOSE Lista
DEALLOCATE Lista

print @TOTAL
SET NOCOUNT OFF

Muchas gracias desde ya,
Saludos
Hernan Rocca

Preguntas similare

Leer las respuestas

#1 Miguel Egea
18/10/2006 - 18:14 | Informe spam
Hola, soy Miguel de la brigada anticursores :), haz tu buena obra del día
mata a este cursor

INSERT INTO Fact_Cab (emp_codigo, suc_codigo, cte_tipo, fac_letra,
fac_numero, cont_numero, fac_fecha, fec_vto, total_cte_neto,
nro_recibo_merc, nro_recibo_iva, fac_facturado, mas_ingreso, mas_asiento,
nd_comp_comision, nd_vend_comision, cont_cerrado, total_iva_merc,
total_iva_otros, fac_fij_item, fac_detalle_modelo, total_neto_gravado,
total_neto_gravado_2, iva_porc, iva_porc_2, fac_cai, fac_cai_vto,
fac_barras, fac_pad_clie)

SELECT 6,1, CASE tipo_de_comprobante WHEN 'BD' THEN 28 WHEN
'BP' THEN 27 WHEN 'CR' THEN 32 WHEN 'CV' THEN 17 WHEN 'DC' THEN 14
ELSE ' ' END, 'A' , numero_de_comprobante,
< AQUÍ EL RESTO DE LOS CAMPOS COMO ESTÁN EN EL OTRO INSERT />
FROM datcom
WHERE idusuario = 50
AND codigo_de_contrato <> 0

estoy seguro que irá muuuuuuucho más rápido en todas las ocasiones
(particularmente si tienes un índice por codigo_de_contrato,idusuario (igual
idusuario,codigo_de_contrato, depende de la distribución)

Saludos
Miguel Egea


"Hernan Rocca" wrote in message
news:%
Mostrar la cita
#2 Alejandro Mesa
18/10/2006 - 18:59 | Informe spam
Miguel,

Te quedo bien, siempre es bienvenido un poco de humor.

Saludos,

Alejandro

"Miguel Egea" wrote:

Mostrar la cita
#3 Hernan Rocca
19/10/2006 - 21:13 | Informe spam
Muchas gracias por la respuesta, en realidad el insert si podria hacerlo
así, el tema es que en el medio tengo cambios en los datos que no puse en el
mail para no engordarlo más, pero no creo poder cambiar el cursor por el
insert de esa manera el problema era que no sabia (perdón, no se,
jejeje) si la performance de la maquina podría estar afectada por la
ejecución del cursor por trabajar con una base temdb muy chica o por no
desocupar memoria y tratar de usar más aparte de la que ya ejecuto, porque
generalmente cuando me pasa eso reinicio la maquina servidora y ejecuto el
script del cursor nuevamente y lo realiza rápido nuevamente...
Gracias de todas formas por su tiempo, y es verdad siempre es bueno un
poco de humor, jejeje
Hasta pronto

Hernan

"Alejandro Mesa" escribió en el
mensaje news:
Mostrar la cita
#4 Miguel Egea
23/10/2006 - 08:45 | Informe spam
sería realmente raro que no pudiesemos matar ese cursor. Y sí, ahí puede
estar buena parte de un mal performance.

pasanos el script completo y si no te lo hacemos te damos las pistas

Saludos
Miguel Egea
"Hernan Rocca" wrote in message
news:Ok8%
Mostrar la cita
Ads by Google
Search Busqueda sugerida