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
 

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:%
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 similares