Como mejorar el performance del Procedimiento alamacenado

09/07/2004 - 21:09 por jose maria | Informe spam
Saludos, tengo un procedimiento almacenado que me consume
el 99% del cpu de mi servidor cada vez que se ejecuta por
un lapso de 8 min.

Si el mismo codigo lo saco del procedimiento almacenado y
lo ejecuto por fuera, hace la misma operacion pero en
30seg.

me gustaria saber si alguien sabe a que se deba esto, si
sql server le da un tratamiento especial al procedimiento
y si es asi como puedo mejorar el performance o configurar
el server. gracias

Preguntas similare

Leer las respuestas

#1 Javier Loria
09/07/2004 - 21:32 | Informe spam
Hola Jose:
Fuerza la recompilacion del procedimiento almacenado:
=EXEC sp_recompile MiProcedimientoAlmacenado
= Si no te funciona podrias, postear el codigo del Procedimiento?


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
jose maria escribio:
Saludos, tengo un procedimiento almacenado que me consume
el 99% del cpu de mi servidor cada vez que se ejecuta por
un lapso de 8 min.

Si el mismo codigo lo saco del procedimiento almacenado y
lo ejecuto por fuera, hace la misma operacion pero en
30seg.

me gustaria saber si alguien sabe a que se deba esto, si
sql server le da un tratamiento especial al procedimiento
y si es asi como puedo mejorar el performance o configurar
el server. gracias
Respuesta Responder a este mensaje
#2 Anonimo
09/07/2004 - 23:18 | Informe spam
create procedure proc_ant_saldo
@id char(20), @cte_numero varchar(20)='%', @dep_id varchar
(20)='%',
@fecha_fin datetime='31-12-9999'
as

insert into antiguedad
select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha_salvta as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin))+(select sum
(importe) from cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin))+(select sum(importe) from
cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin)),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo+(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total+
(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo,2)
else a.total
END,
a.stfac, 1 as orden, b.cliente_t
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha_salvta<=@fecha_fin
and /*a.stfac>1 and*/ a.cargo_t='F' and a.cte_numero like
@cte_numero and a.dep_id like @dep_id

union all

select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) THEN round
(a.total-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stfac, 1 as orden,
b.cliente_t
02/Jun/2004)
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin /*and
a.stfac>1*/ and a.cargo_t in
('R','C','D','U','O','X','H','M','Y','W') and a.cte_numero
like @cte_numero and a.dep_id like @dep_id



union all

select @id, null as factura_id, abono_t, a.folio,
a.dep_id, a.cte_numero, null as fecha_venc, null as
fecha_pago, a.fecha, null as forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
abn_numero=a.numero and abn_abono_t=a.abono_t and
fecha<=@fecha_fin and (fecha_canc is null or
fecha_canc>@fecha_fin)) THEN round(a.total-(select sum
(importe) from abn_fac where abn_numero=a.numero and
abn_abono_t=a.abono_t and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stabn, 3 as orden, b.cliente_t
from view_fecha_abono as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin and
a.stabn>0 and a.cte_numero like @cte_numero and a.dep_id
like @dep_id
return

GO

Hola Jose:
Fuerza la recompilacion del procedimiento almacenado:
=>EXEC sp_recompile MiProcedimientoAlmacenado
=> Si no te funciona podrias, postear el codigo del


Procedimiento?


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
jose maria escribio:
Saludos, tengo un procedimiento almacenado que me




consume
el 99% del cpu de mi servidor cada vez que se ejecuta




por
un lapso de 8 min.

Si el mismo codigo lo saco del procedimiento almacenado




y
lo ejecuto por fuera, hace la misma operacion pero en
30seg.

me gustaria saber si alguien sabe a que se deba esto, si
sql server le da un tratamiento especial al




procedimiento
y si es asi como puedo mejorar el performance o




configurar
el server. gracias




.

Respuesta Responder a este mensaje
#3 Javier Loria
10/07/2004 - 06:16 | Informe spam
Hola:
El problema me parece es porque al tener subconsultas obligas al SQL a
recompilar el procedimiento multiples veces en una sola ejecucion, cuando lo
corres con el Query Analizer eso no ocurre.
En principio si una subconsulta devuelve un valor, o si se utiliza en un
FROM no debe dar ningun problema, cuando se utiliza un consulta en el SELECT
o en el WHERE y usa como parte alguna columna externa esto obliga al
servidor a correr n veces la subconsulta, donde n es el numero de filas de
la consulta externa.
En general alejate de:
SELECT
, (SELECT ... FROM T2 WHERE T1.Col1=T2.Col1)
FROM T1
La mayoria de estas expresiones se puede resolver sin SubConsultas
. Puedes probar si este SELECT te da el mismo resultado que la consulta con
los anidados (sin los unions)
SELECT @id
, a.id as factura_id
, cargo_t
, a.folio_fiscal
, a.dep_id
, a.cte_numero
, a.fecha_venc
, a.fecha_pago
, a.fecha_salvta
, forma_pago_t
, a.total
, a.total
- CASE WHEN (e.Numero IS NOT NULL) THEN a.anticipo
ELSE 0 END
- ROUND(COALESCE(C.Importe, 0),2)
+ ROUND(COALESCE(D.Importe, 0),2)
, a.stfac
, 1 as orden
, b.cliente_t
FROM factura as a
JOIN cliente as b
ON a.cte_numero=b.numero
LEFT JOIN (SELECT factura_id, SUM(Importe) AS Importe
FROM abn_fac
GROUP BY Factura_ID
WHERE c.stafa>0
AND c.fecha<=@fecha_fin
AND (c.fecha_canc is null or c.fecha_canc>@fecha_fin)) AS C
ON C.factura_id=a.id
LEFT JOIN (SELECT factura_id, SUM(Importe) AS Importe
FROM cargo_factura
GROUP BY Factura_ID
WHERE fecha<=@fecha_fin) AS D
ON d.factura_id=a.id
LEFT JOIN (SELECT DISTINCT Numero
FROM Factura
WHERE Cargo_t='F' AND imprime=0) AS E
ON E.numero=a.anticipo_fac)
WHERE a.fecha_salvta<=@fecha_fin
AND a.cargo_t='F'
AND a.cte_numero like @cte_numero
AND a.dep_id like @dep_id
La intencion en esta consulta es "aplanar" las subconsultas.
Es posible que tenga errores de sintaxis porque no tengo el esquema de
las tablas y no lo probe pero creo que debe dar el mismo resultado y mucho
mas rapido.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.



escribio:
create procedure proc_ant_saldo
@id char(20), @cte_numero varchar(20)='%', @dep_id varchar
(20)='%',
@fecha_fin datetime='31-12-9999'
as

insert into antiguedad
select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha_salvta as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin))+(select sum
(importe) from cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin))+(select sum(importe) from
cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin)),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo+(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total+
(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo,2)
else a.total
END,
a.stfac, 1 as orden, b.cliente_t
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha_salvta<=@fecha_fin
and /*a.stfac>1 and*/ a.cargo_t='F' and a.cte_numero like
@cte_numero and a.dep_id like @dep_id

union all

select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) THEN round
(a.total-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stfac, 1 as orden,
b.cliente_t
02/Jun/2004)
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin /*and
a.stfac>1*/ and a.cargo_t in
('R','C','D','U','O','X','H','M','Y','W') and a.cte_numero
like @cte_numero and a.dep_id like @dep_id



union all

select @id, null as factura_id, abono_t, a.folio,
a.dep_id, a.cte_numero, null as fecha_venc, null as
fecha_pago, a.fecha, null as forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
abn_numero=a.numero and abn_abono_t=a.abono_t and
fecha<=@fecha_fin and (fecha_canc is null or
fecha_canc>@fecha_fin)) THEN round(a.total-(select sum
(importe) from abn_fac where abn_numero=a.numero and
abn_abono_t=a.abono_t and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stabn, 3 as orden, b.cliente_t
from view_fecha_abono as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin and
a.stabn>0 and a.cte_numero like @cte_numero and a.dep_id
like @dep_id
return

GO

Hola Jose:
Fuerza la recompilacion del procedimiento almacenado:
=>> EXEC sp_recompile MiProcedimientoAlmacenado
=>> Si no te funciona podrias, postear el codigo del Procedimiento?


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
jose maria escribio:
Saludos, tengo un procedimiento almacenado que me consume
el 99% del cpu de mi servidor cada vez que se ejecuta por
un lapso de 8 min.

Si el mismo codigo lo saco del procedimiento almacenado y
lo ejecuto por fuera, hace la misma operacion pero en
30seg.

me gustaria saber si alguien sabe a que se deba esto, si
sql server le da un tratamiento especial al procedimiento
y si es asi como puedo mejorar el performance o configurar
el server. gracias




.
Respuesta Responder a este mensaje
#4 Norman A. Armas
10/07/2004 - 16:11 | Informe spam
El problema lo tienes con LIKE '%

cuando usas ese tipo de consulta SQL no puede usar indices para realizar la
busqueda,
del la unica forma que usa es si el % esta el final de la cadena no al
principio.

Saludos,

Norman



wrote in message
news:2982e01c465fa$36ac08d0$


create procedure proc_ant_saldo
@id char(20), @cte_numero varchar(20)='%', @dep_id varchar
(20)='%',
@fecha_fin datetime='31-12-9999'
as

insert into antiguedad
select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha_salvta as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin))+(select sum
(importe) from cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin))+(select sum(importe) from
cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin)),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo+(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total+
(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo,2)
else a.total
END,
a.stfac, 1 as orden, b.cliente_t
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha_salvta<=@fecha_fin
and /*a.stfac>1 and*/ a.cargo_t='F' and a.cte_numero like
@cte_numero and a.dep_id like @dep_id

union all

select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) THEN round
(a.total-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stfac, 1 as orden,
b.cliente_t
02/Jun/2004)
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin /*and
a.stfac>1*/ and a.cargo_t in
('R','C','D','U','O','X','H','M','Y','W') and a.cte_numero
like @cte_numero and a.dep_id like @dep_id



union all

select @id, null as factura_id, abono_t, a.folio,
a.dep_id, a.cte_numero, null as fecha_venc, null as
fecha_pago, a.fecha, null as forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
abn_numero=a.numero and abn_abono_t=a.abono_t and
fecha<=@fecha_fin and (fecha_canc is null or
fecha_canc>@fecha_fin)) THEN round(a.total-(select sum
(importe) from abn_fac where abn_numero=a.numero and
abn_abono_t=a.abono_t and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stabn, 3 as orden, b.cliente_t
from view_fecha_abono as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin and
a.stabn>0 and a.cte_numero like @cte_numero and a.dep_id
like @dep_id
return

GO

>Hola Jose:
> Fuerza la recompilacion del procedimiento almacenado:
>=> >EXEC sp_recompile MiProcedimientoAlmacenado
>=> > Si no te funciona podrias, postear el codigo del
Procedimiento?
>
>
>Javier Loria
>Costa Rica
>Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>que pueda ser copiado y pegado al Query Analizer.
>La version de SQL y Service Pack tambien ayuda.
>jose maria escribio:
>> Saludos, tengo un procedimiento almacenado que me
consume
>> el 99% del cpu de mi servidor cada vez que se ejecuta
por
>> un lapso de 8 min.
>>
>> Si el mismo codigo lo saco del procedimiento almacenado
y
>> lo ejecuto por fuera, hace la misma operacion pero en
>> 30seg.
>>
>> me gustaria saber si alguien sabe a que se deba esto, si
>> sql server le da un tratamiento especial al
procedimiento
>> y si es asi como puedo mejorar el performance o
configurar
>> el server. gracias
>
>
>.
>
Respuesta Responder a este mensaje
#5 Javier Loria
10/07/2004 - 17:15 | Informe spam
Hola Norman:
El LIKE '%' no explica porque el procedimiento tarda 16 veces mas que la
consulta escrita directamente en el query analizer, ni el procesador al
100%.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Norman A. Armas escribio:
El problema lo tienes con LIKE '%

cuando usas ese tipo de consulta SQL no puede usar indices para
realizar la busqueda,
del la unica forma que usa es si el % esta el final de la cadena no al
principio.


wrote in message
news:2982e01c465fa$36ac08d0$


create procedure proc_ant_saldo
@id char(20), @cte_numero varchar(20)='%', @dep_id varchar
(20)='%',
@fecha_fin datetime='31-12-9999'
as

insert into antiguedad
select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha_salvta as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin))+(select sum
(importe) from cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and exists
(select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin))+(select sum(importe) from
cargo_factura where factura_id=a.id and
fecha<=@fecha_fin),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
(select sum(importe) from abn_fac where factura_id=a.id
and stafa>0 and fecha<=@fecha_fin and (fecha_canc is null
or fecha_canc>@fecha_fin)),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo+(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and not exists
(select top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total+
(select sum(importe) from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin),2)
WHEN not exists (select top 1 factura_id from abn_fac
where factura_id=a.id and stafa>0 and fecha<=@fecha_fin
and (fecha_canc is null or fecha_canc>@fecha_fin)) and not
exists (select top 1 factura_id from cargo_factura where
factura_id=a.id and fecha<=@fecha_fin) and exists (select
top 1 id from factura where cargo_t='F' and
numero=a.anticipo_fac and imprime=0) THEN round(a.total-
a.anticipo,2)
else a.total
END,
a.stfac, 1 as orden, b.cliente_t
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha_salvta<=@fecha_fin
and /*a.stfac>1 and*/ a.cargo_t='F' and a.cte_numero like
@cte_numero and a.dep_id like @dep_id

union all

select @id, a.id as factura_id, cargo_t, a.folio_fiscal,
a.dep_id, a.cte_numero, a.fecha_venc, a.fecha_pago,
a.fecha as fecha, forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)) THEN round
(a.total-(select sum(importe) from abn_fac where
factura_id=a.id and stafa>0 and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stfac, 1 as orden,
b.cliente_t
02/Jun/2004)
from factura as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin /*and
a.stfac>1*/ and a.cargo_t in
('R','C','D','U','O','X','H','M','Y','W') and a.cte_numero
like @cte_numero and a.dep_id like @dep_id



union all

select @id, null as factura_id, abono_t, a.folio,
a.dep_id, a.cte_numero, null as fecha_venc, null as
fecha_pago, a.fecha, null as forma_pago_t, a.total,
'saldo_doc'ÊSE
WHEN exists (select top 1 factura_id from abn_fac where
abn_numero=a.numero and abn_abono_t=a.abono_t and
fecha<=@fecha_fin and (fecha_canc is null or
fecha_canc>@fecha_fin)) THEN round(a.total-(select sum
(importe) from abn_fac where abn_numero=a.numero and
abn_abono_t=a.abono_t and fecha<=@fecha_fin and
(fecha_canc is null or fecha_canc>@fecha_fin)),2)
ELSE a.total
END,
a.stabn, 3 as orden, b.cliente_t
from view_fecha_abono as a, cliente as b where
a.cte_numero=b.numero and a.fecha<=@fecha_fin and
a.stabn>0 and a.cte_numero like @cte_numero and a.dep_id
like @dep_id
return

GO

Hola Jose:
Fuerza la recompilacion del procedimiento almacenado:
=>>> EXEC sp_recompile MiProcedimientoAlmacenado
=>>> Si no te funciona podrias, postear el codigo del


Procedimiento?


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
jose maria escribio:
Saludos, tengo un procedimiento almacenado que me




consume
el 99% del cpu de mi servidor cada vez que se ejecuta




por
un lapso de 8 min.

Si el mismo codigo lo saco del procedimiento almacenado




y
lo ejecuto por fuera, hace la misma operacion pero en
30seg.

me gustaria saber si alguien sabe a que se deba esto, si
sql server le da un tratamiento especial al




procedimiento
y si es asi como puedo mejorar el performance o




configurar
el server. gracias




.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida