problemas con Procediento Almacenado

11/10/2005 - 18:09 por Diego M R®mero | Informe spam
Hola
Como estan ?

Como puedo mejorar el desempeño de un procedimiento almacenado, que se
demora mas o menos 30 segundos en seleccionar 20 registros de una tabla,
donde hay por lo menos, 175000 registros.

Me preocupa por que esto solo lleva 6 meses de movimiento e imaginense
cuando lleva mas de 2 años, será imposible ejecutar este procedimiento.

Será que la demora es por los paramentros que evaluan si es nulo.

Agradezco su colaboración.

Diego


CREATE PROCEDURE paQryVencimientosLta @pmTipDoc VARCHAR(3),@pmIdCia
CHAR(2),@pmIdClase VARCHAR(4),@pmIdCliente VARCHAR(11),@pmIdVehiculo
VARCHAR(10)

AS
SELECT TipDoc, Documento, IdCia, Item,ValorFactura-ValorAbono AS
ValorSaldo,ValorFactura,ValorAbono,FecEmision,FecVence,
IdCliente,T.RazonSocial AS NomCliente,IdAgencia,
IdVehiculo,VehPropio,IdVendedor,C.RazonSocial AS Conductor
,V.IdCargo AS IdCarg,Concepto,V.IdClase AS CodClase,ClaseCuenta,Factura,
Referencia, Detalle,TipRec, Recibo, IdCiaRec,ValorAtcpo
FROM Trn_Vencimientos AS V INNER JOIN Terceros AS T ON
V.IdCliente=T.IdTercero
INNER JOIN ClaseCue AS U ON V.IdClase=U.IdClase
INNER JOIN Terceros AS C ON V.IdVendedor=C.IdTercero
INNER JOIN Fijos AS F ON V.IdCargo=F.IdCargo
WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc) AND
IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase ,V.IdClase)
AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)
ORDER BY Prioridad,FecVence,TipDoc,IdCia,Documento,Item
GO

Preguntas similare

Leer las respuestas

#1 Maxi
11/10/2005 - 18:08 | Informe spam
Hola, el problema lo tienes aqui:

WHERE (ValorFactura-ValorAbono)>0

Si usas asi el Where no usara indices :(



Salu2
Maxi [MVP SQL SERVER]


"Diego M R®mero" escribió en el mensaje
news:
Hola
Como estan ?

Como puedo mejorar el desempeño de un procedimiento almacenado, que se
demora mas o menos 30 segundos en seleccionar 20 registros de una tabla,
donde hay por lo menos, 175000 registros.

Me preocupa por que esto solo lleva 6 meses de movimiento e imaginense
cuando lleva mas de 2 años, será imposible ejecutar este procedimiento.

Será que la demora es por los paramentros que evaluan si es nulo.

Agradezco su colaboración.

Diego


CREATE PROCEDURE paQryVencimientosLta @pmTipDoc VARCHAR(3),@pmIdCia
CHAR(2),@pmIdClase VARCHAR(4),@pmIdCliente VARCHAR(11),@pmIdVehiculo
VARCHAR(10)

AS
SELECT TipDoc, Documento, IdCia, Item,ValorFactura-ValorAbono AS
ValorSaldo,ValorFactura,ValorAbono,FecEmision,FecVence,
IdCliente,T.RazonSocial AS NomCliente,IdAgencia,
IdVehiculo,VehPropio,IdVendedor,C.RazonSocial AS Conductor
,V.IdCargo AS IdCarg,Concepto,V.IdClase AS CodClase,ClaseCuenta,Factura,
Referencia, Detalle,TipRec, Recibo, IdCiaRec,ValorAtcpo
FROM Trn_Vencimientos AS V INNER JOIN Terceros AS T ON
V.IdCliente=T.IdTercero
INNER JOIN ClaseCue AS U ON V.IdClase=U.IdClase
INNER JOIN Terceros AS C ON V.IdVendedor=C.IdTercero
INNER JOIN Fijos AS F ON V.IdCargo=F.IdCargo
WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc) AND
IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase ,V.IdClase)
AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)
ORDER BY Prioridad,FecVence,TipDoc,IdCia,Documento,Item
GO



Respuesta Responder a este mensaje
#2 Harold Crow
11/10/2005 - 18:11 | Informe spam
y tienes los indices necesarios?
son clustered?


"Diego M R®mero" escribió en el mensaje
news:
Hola
Como estan ?

Como puedo mejorar el desempeño de un procedimiento almacenado, que se
demora mas o menos 30 segundos en seleccionar 20 registros de una tabla,
donde hay por lo menos, 175000 registros.

Me preocupa por que esto solo lleva 6 meses de movimiento e imaginense
cuando lleva mas de 2 años, será imposible ejecutar este procedimiento.

Será que la demora es por los paramentros que evaluan si es nulo.

Agradezco su colaboración.

Diego


CREATE PROCEDURE paQryVencimientosLta @pmTipDoc VARCHAR(3),@pmIdCia
CHAR(2),@pmIdClase VARCHAR(4),@pmIdCliente VARCHAR(11),@pmIdVehiculo
VARCHAR(10)

AS
SELECT TipDoc, Documento, IdCia, Item,ValorFactura-ValorAbono AS
ValorSaldo,ValorFactura,ValorAbono,FecEmision,FecVence,
IdCliente,T.RazonSocial AS NomCliente,IdAgencia,
IdVehiculo,VehPropio,IdVendedor,C.RazonSocial AS Conductor
,V.IdCargo AS IdCarg,Concepto,V.IdClase AS CodClase,ClaseCuenta,Factura,
Referencia, Detalle,TipRec, Recibo, IdCiaRec,ValorAtcpo
FROM Trn_Vencimientos AS V INNER JOIN Terceros AS T ON
V.IdCliente=T.IdTercero
INNER JOIN ClaseCue AS U ON V.IdClase=U.IdClase
INNER JOIN Terceros AS C ON V.IdVendedor=C.IdTercero
INNER JOIN Fijos AS F ON V.IdCargo=F.IdCargo
WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc) AND
IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase ,V.IdClase)
AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)
ORDER BY Prioridad,FecVence,TipDoc,IdCia,Documento,Item
GO



Respuesta Responder a este mensaje
#3 Diego M R®mero
11/10/2005 - 18:36 | Informe spam
Bueno, y en este caso; que solo necesito seleccionar los registros con saldo
¿Como hago?

Aun soy novato en Sql , tengo algunas dudas:
¿ Si utilizo un campo en el where , este debe tener un indice?
¿ Que influye los indices en las consultas ?

Agradezco me de mas orientaciones sobre los ídices , o donde encuentro
información

Diego



"Maxi" escribió en el mensaje
news:#
Hola, el problema lo tienes aqui:

WHERE (ValorFactura-ValorAbono)>0

Si usas asi el Where no usara indices :(



Salu2
Maxi [MVP SQL SERVER]


"Diego M R®mero" escribió en el mensaje
news:
> Hola
> Como estan ?
>
> Como puedo mejorar el desempeño de un procedimiento almacenado, que se
> demora mas o menos 30 segundos en seleccionar 20 registros de una


tabla,
> donde hay por lo menos, 175000 registros.
>
> Me preocupa por que esto solo lleva 6 meses de movimiento e imaginense
> cuando lleva mas de 2 años, será imposible ejecutar este procedimiento.
>
> Será que la demora es por los paramentros que evaluan si es nulo.
>
> Agradezco su colaboración.
>
> Diego
>
>
> CREATE PROCEDURE paQryVencimientosLta @pmTipDoc VARCHAR(3),@pmIdCia
> CHAR(2),@pmIdClase VARCHAR(4),@pmIdCliente VARCHAR(11),@pmIdVehiculo
> VARCHAR(10)
>
> AS
> SELECT TipDoc, Documento, IdCia, Item,ValorFactura-ValorAbono AS
> ValorSaldo,ValorFactura,ValorAbono,FecEmision,FecVence,
> IdCliente,T.RazonSocial AS NomCliente,IdAgencia,
> IdVehiculo,VehPropio,IdVendedor,C.RazonSocial AS Conductor
> ,V.IdCargo AS IdCarg,Concepto,V.IdClase AS CodClase,ClaseCuenta,Factura,
> Referencia, Detalle,TipRec, Recibo, IdCiaRec,ValorAtcpo
> FROM Trn_Vencimientos AS V INNER JOIN Terceros AS T ON
> V.IdCliente=T.IdTercero
> INNER JOIN ClaseCue AS U ON V.IdClase=U.IdClase
> INNER JOIN Terceros AS C ON V.IdVendedor=C.IdTercero
> INNER JOIN Fijos AS F ON V.IdCargo=F.IdCargo
> WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc)


AND
> IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase


,V.IdClase)
> AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
> AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)
> ORDER BY Prioridad,FecVence,TipDoc,IdCia,Documento,Item
> GO
>
>
>


Respuesta Responder a este mensaje
#4 Diego M R®mero
11/10/2005 - 18:40 | Informe spam
Y este procedimiento, se demora mas o menos 2 minutos.
Lo que hace es actualizar la columna del total abonado, de cada factura.

CREATE PROCEDURE paUpVencimientosApl @pmIdVehiculo
VARCHAR(10)=Null,@pmIdCliente VARCHAR(11)=Null,@pmIdCia
CHAR(2)=Null,@pmIdClase VARCHAR(4)=Null
,@pmTipDoc VARCHAR(3)=Null,@pmFechaIni SMALLDATETIME=Null,@pmFechaFin
SMALLDATETIME=Null,@pmIdGrupo VARCHAR(4)=Null
AS
UPDATE Trn_Vencimientos SET Trn_Vencimientos.ValorAbono=(SELECT
ISNULL(SUM(Trn_RecFactura.ValorAbono-Trn_RecFactura.Devolucion),0)
FROM Trn_RecFactura WHERE Trn_Vencimientos.TipDoc=Trn_RecFactura.TipDoc AND
Trn_Vencimientos.Documento =Trn_RecFactura.Documento
AND Trn_Vencimientos.IdCia=Trn_RecFactura.IdCiaDoc AND
Trn_Vencimientos.Item=Trn_RecFactura.ItemDoc)
FROM Trn_Vencimientos INNER JOIN Vehiculos ON
Trn_Vencimientos.IdVehiculo=Vehiculos.IdVehiculo
WHERE FecEmision BETWEEN @pmFechaIni AND @pmFechaFin
AND
Trn_Vencimientos.IdVehiculo=ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo
) AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
AND IdCia=ISNULL(@pmIdCia,IdCia) AND
Trn_Vencimientos.IdClase=ISNULL(@pmIdClase,Trn_Vencimientos.IdClase) AND
TipDoc=ISNULL(@pmTipDoc,TipDoc)
AND IdGrupo=ISNULL(@pmIdGrupo,IdGrupo)

La tabla Vehiculos se une al INNER JOIN , porque ahí está el campo IdGrupo,
que se incluye ne el WHERE




Diego

"Maxi" escribió en el mensaje
news:#
Hola, el problema lo tienes aqui:

WHERE (ValorFactura-ValorAbono)>0

Si usas asi el Where no usara indices :(



Salu2
Maxi [MVP SQL SERVER]


"Diego M R®mero" escribió en el mensaje
news:
> Hola
> Como estan ?
>
> Como puedo mejorar el desempeño de un procedimiento almacenado, que se
> demora mas o menos 30 segundos en seleccionar 20 registros de una


tabla,
> donde hay por lo menos, 175000 registros.
>
> Me preocupa por que esto solo lleva 6 meses de movimiento e imaginense
> cuando lleva mas de 2 años, será imposible ejecutar este procedimiento.
>
> Será que la demora es por los paramentros que evaluan si es nulo.
>
> Agradezco su colaboración.
>
> Diego
>
>
> CREATE PROCEDURE paQryVencimientosLta @pmTipDoc VARCHAR(3),@pmIdCia
> CHAR(2),@pmIdClase VARCHAR(4),@pmIdCliente VARCHAR(11),@pmIdVehiculo
> VARCHAR(10)
>
> AS
> SELECT TipDoc, Documento, IdCia, Item,ValorFactura-ValorAbono AS
> ValorSaldo,ValorFactura,ValorAbono,FecEmision,FecVence,
> IdCliente,T.RazonSocial AS NomCliente,IdAgencia,
> IdVehiculo,VehPropio,IdVendedor,C.RazonSocial AS Conductor
> ,V.IdCargo AS IdCarg,Concepto,V.IdClase AS CodClase,ClaseCuenta,Factura,
> Referencia, Detalle,TipRec, Recibo, IdCiaRec,ValorAtcpo
> FROM Trn_Vencimientos AS V INNER JOIN Terceros AS T ON
> V.IdCliente=T.IdTercero
> INNER JOIN ClaseCue AS U ON V.IdClase=U.IdClase
> INNER JOIN Terceros AS C ON V.IdVendedor=C.IdTercero
> INNER JOIN Fijos AS F ON V.IdCargo=F.IdCargo
> WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc)


AND
> IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase


,V.IdClase)
> AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
> AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)
> ORDER BY Prioridad,FecVence,TipDoc,IdCia,Documento,Item
> GO
>
>
>


Respuesta Responder a este mensaje
#5 Alejandro Mesa
11/10/2005 - 18:42 | Informe spam
Diego,

Aqui van algunos puntos a chequear:

- asegurate de que cada tabla tenga un indice clustered
- que exista un indice por cada columna o grupo de columnas que participan
en una restricion de clave foranea o en el join
- asegurate de tener un indice por cada columna que aparezca en el filtro, o
ver si es posible usar un "covering index" (indice que cubra todas las
columnas que participan en la sentencia).
- De ser posible, trata de ordenar o sortear en la aplicacion cliente en vez
de en el server
- asegurate de usar expresiones que sql server reconozca como argumentos de
busqueda para que este pueda analizar si usa algun indcie asociado o no. el
patron a seguir es:

<nombre_de_columna> <operador> <constante>

Por ejemplo, he notado las siguientes expresiones en el filtro:

WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc) AND
IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase ,V.IdClase)
AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)

(ValorFactura-ValorAbono)>0



esta debe cambiarse por: ValorFactura > ValorAbono

IdCia=ISNULL(@pmIdCia,IdCia)



IdCia like coalesce(@pmIdCia, '%')

V.IdClase=ISNULL(@pmIdClase ,V.IdClase)



V.IdClase like coalesce(@pmIdClase, '%')

etc.


Ejemplo:

use northwind
go

exec sp_helpindex customers
go

dbcc dropcleanbuffers
dbcc freeproccache
go

set showplan_text on
go

declare @companyname nvarchar(40)

select
*
from
dbo.Customers
where
CompanyName like coalesce(@companyname, '%')
go

dbcc dropcleanbuffers
dbcc freeproccache
go

declare @companyname nvarchar(40)

set @companyname = 'Bólido Comidas preparadas'

select
*
from
dbo.Customers
where
CompanyName like coalesce(@companyname, '%')
go

dbcc dropcleanbuffers
dbcc freeproccache
go

declare @companyname nvarchar(40)

set @companyname = 'Bólido Comidas preparadas'

select
*
from
dbo.Customers
where
CompanyName = isnull(@companyname, CompanyName)
go

set showplan_text off
go

Fijate que en las dos primeras sentencias, sql server hace un index seek en:

[Northwind].[dbo].[Customers].[CompanyName])

pero en la tercera sentencia, la cual usa el patron que tienes en el sp, sql
server hace un index scan.


Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html

Search Arguments
http://groups.google.nl/group/micro...3adc1f61f9

Tips on Optimizing SQL Server Indexes
http://www.sql-server-performance.c...ndexes.asp


AMB

"Diego M R®mero" wrote:

Hola
Como estan ?

Como puedo mejorar el desempeño de un procedimiento almacenado, que se
demora mas o menos 30 segundos en seleccionar 20 registros de una tabla,
donde hay por lo menos, 175000 registros.

Me preocupa por que esto solo lleva 6 meses de movimiento e imaginense
cuando lleva mas de 2 años, será imposible ejecutar este procedimiento.

Será que la demora es por los paramentros que evaluan si es nulo.

Agradezco su colaboración.

Diego


CREATE PROCEDURE paQryVencimientosLta @pmTipDoc VARCHAR(3),@pmIdCia
CHAR(2),@pmIdClase VARCHAR(4),@pmIdCliente VARCHAR(11),@pmIdVehiculo
VARCHAR(10)

AS
SELECT TipDoc, Documento, IdCia, Item,ValorFactura-ValorAbono AS
ValorSaldo,ValorFactura,ValorAbono,FecEmision,FecVence,
IdCliente,T.RazonSocial AS NomCliente,IdAgencia,
IdVehiculo,VehPropio,IdVendedor,C.RazonSocial AS Conductor
,V.IdCargo AS IdCarg,Concepto,V.IdClase AS CodClase,ClaseCuenta,Factura,
Referencia, Detalle,TipRec, Recibo, IdCiaRec,ValorAtcpo
FROM Trn_Vencimientos AS V INNER JOIN Terceros AS T ON
V.IdCliente=T.IdTercero
INNER JOIN ClaseCue AS U ON V.IdClase=U.IdClase
INNER JOIN Terceros AS C ON V.IdVendedor=C.IdTercero
INNER JOIN Fijos AS F ON V.IdCargo=F.IdCargo
WHERE (ValorFactura-ValorAbono)>0 AND TipDoc=ISNULL(@pmTipDoc,TipDoc) AND
IdCia=ISNULL(@pmIdCia,IdCia) AND V.IdClase=ISNULL(@pmIdClase ,V.IdClase)
AND IdCliente=ISNULL(@pmIdCliente,IdCliente)
AND IdVehiculo=ISNULL(@pmIdVehiculo,IdVehiculo)
ORDER BY Prioridad,FecVence,TipDoc,IdCia,Documento,Item
GO




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