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

#6 Maxi
11/10/2005 - 19:14 | Informe spam
Ale, un solo comentario:

IdCia=ISNULL(@pmIdCia,IdCia)



IdCia like coalesce(@pmIdCia, '%')



Si usas isnull con el like tambien funciona, el que no hace usar el indice
es el = :(



Salu2
Maxi [MVP SQL SERVER]


"Alejandro Mesa" escribió en el
mensaje news:
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
#7 Alejandro Mesa
11/10/2005 - 19:52 | Informe spam
Maxi,

>> IdCia=ISNULL(@pmIdCia,IdCia)
>
> IdCia like coalesce(@pmIdCia, '%')

Si usas isnull con el like tambien funciona, el que no hace usar el indice
es el = :(



Correcto, no dije que era el ISNULL el problema, solo indique usar el
operador like en vez del "=".
El que use ISNULL o COALESCE es a su conveniencia.


AMB

"Maxi" wrote:

Ale, un solo comentario:

>> IdCia=ISNULL(@pmIdCia,IdCia)
>
> IdCia like coalesce(@pmIdCia, '%')

Si usas isnull con el like tambien funciona, el que no hace usar el indice
es el = :(



Salu2
Maxi [MVP SQL SERVER]


"Alejandro Mesa" escribió en el
mensaje news:
> 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
#8 Maxi
11/10/2005 - 19:53 | Informe spam
okis :-)


Salu2
Maxi [MVP SQL SERVER]


"Alejandro Mesa" escribió en el
mensaje news:
Maxi,

>> IdCia=ISNULL(@pmIdCia,IdCia)
>
> IdCia like coalesce(@pmIdCia, '%')

Si usas isnull con el like tambien funciona, el que no hace usar el
indice
es el = :(



Correcto, no dije que era el ISNULL el problema, solo indique usar el
operador like en vez del "=".
El que use ISNULL o COALESCE es a su conveniencia.


AMB

"Maxi" wrote:

Ale, un solo comentario:

>> IdCia=ISNULL(@pmIdCia,IdCia)
>
> IdCia like coalesce(@pmIdCia, '%')

Si usas isnull con el like tambien funciona, el que no hace usar el
indice
es el = :(



Salu2
Maxi [MVP SQL SERVER]


"Alejandro Mesa" escribió en el
mensaje news:
> 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
#9 Diego M R®mero
11/10/2005 - 21:13 | Informe spam
Gracias , por sus aportes, los tendre en cuenta.

Diego


"Alejandro Mesa" escribió en el
mensaje news:
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...ng/browse_
thread/thread/208d2d48e873d53e/043fef3adc1f61f9?q=disproved+gert-jan+strik&r
num=1&hl=nl#043fef3adc1f61f9

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
#10 Saul Batista
13/10/2005 - 14:59 | Informe spam
Otra opcion que tienes es criar el select dinamicamente donde solo tienes
las condiciones que se aplican
y asi no vas a tener un WHERE con tantas condiciones y luego más rapido.

Saludos,

Saul Batista



"Diego M R®mero" wrote in message
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida