¿ Como hago para mejorar Procedimiento ?

21/10/2005 - 16:30 por Diego M R®mero | Informe spam
Hola

No he podido mejorar este procedimiento; ya le cree indices a todos los
campos que utiliza la clausula WHERE
,se cambie el operador ( = ) por LIKE.

En la tabla Trn_Vencimientos hay mas o menos 250000 registros, y en
Trn_RecFactura hay unos 200000.

Al ejecutar el procedimiento así:
paUpVencimientosApl 'SDD038'
Se está demorando 30 segundos, actualizando mas o menos 800 registro del
vehículo 'SDD038'

¿ Que puedo hacer para reducir el tiempo de ejecución ?

Agradezco su colaboración.

= procedimiento almacenado
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
AS
IF ISDATE(@pmFechaIni)>0 AND ISDATE(@pmFechaFin)>0--POR FECHA
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)
WHERE FecEmision BETWEEN @pmFechaIni AND @pmFechaFin
AND Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo) AND IdCliente like
ISNULL(@pmIdCliente,IdCliente)
AND IdCia like ISNULL(@pmIdCia,IdCia) AND Trn_Vencimientos.IdClase like
ISNULL(@pmIdClase,Trn_Vencimientos.IdClase) AND TipDoc like
ISNULL(@pmTipDoc,TipDoc)
ELSE
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)
WHERE Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo) AND IdCliente like
ISNULL(@pmIdCliente,IdCliente)
AND IdCia like ISNULL(@pmIdCia,IdCia) AND Trn_Vencimientos.IdClase like
ISNULL(@pmIdClase,Trn_Vencimientos.IdClase) AND TipDoc like
ISNULL(@pmTipDoc,TipDoc)
GO

= PLAN DE EJECUCION ==
StmtText
SET SHOWPLAN_TEXT ON

(1 row(s) affected)

StmtText
-
-
-
-
paUpVencimientosApl 'SDD038'
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
AS
IF ISDATE(@
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_RecFactu

(3 row(s) affected)

StmtText
-
-
-
-
|--Assert(WHERE:(If (([Expr1008]>=0.00 AND
[Expr1008]<=[Trn_Vencimientos].[ValorFactura]+1.00)=0) then 0 else NULL))
|--Clustered Index
Update(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
SET:([Trn_Vencimientos].[ValorAbono]=RaiseIfNull([Expr1008])))
|--Compute
Scalar(DEFINE:([Expr1008]=isnull([Expr1006], 0.00)))
|--Stream Aggregate(GROUP
BY:([Trn_Vencimientos].[TipDoc], [Trn_Vencimientos].[Documento],
[Trn_Vencimientos].[IdCia], [Trn_Vencimientos].[Item])
DEFINE:([Expr1006]=SUM([Trn_RecFactura].[ValorAbono]-[Trn_RecFactura].[Devol
ucion])
|--Bookmark Lookup(BOOKMARK:([Bmk1004]),
OBJECT:([dbBusNT].[dbo].[Trn_RecFactura]))
|--Parallelism(Gather Streams, ORDER
BY:([Trn_Vencimientos].[TipDoc] ASC, [Trn_Vencimientos].[Documento] ASC,
[Trn_Vencimientos].[IdCia] ASC, [Trn_Vencimientos].[Item] ASC))
|--Nested Loops(Left Outer Join,
OUTER REFERENCES:([Trn_Vencimientos].[Item], [Trn_Vencimientos].[IdCia],
[Trn_Vencimientos].[Documento], [Trn_Vencimientos].[TipDoc]))
|--Parallelism(Distribute
Streams)
| |--Top(ROWCOUNT est 0)
|
|--Parallelism(Gather Streams, ORDER BY:([Trn_Vencimientos].[TipDoc] ASC,
[Trn_Vencimientos].[Documento] ASC, [Trn_Vencimientos].[IdCia] ASC,
[Trn_Vencimientos].[Item] ASC))
|
|--Filter(WHERE:((like([Trn_Vencimientos].[IdCia], isnull([@pmIdCia],
[Trn_Vencimientos].[IdCia]), NULL) AND like([Trn_Vencimientos].[IdClase],
isnull([@pmIdClase], [Trn_Vencimientos].[IdClase])
|
|--Clustered Index
Scan(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
WHERE:((([Trn_Vencimientos].[FecEmision]>=[@pmFechaIni] AND
[Trn_Vencimientos].[FecEmision]<=[@pm
|--Index
Seek(OBJECT:([dbBusNT].[dbo].[Trn_RecFactura].[IX_Trn_RecFacturaDocumento]),
SEEK:([Trn_RecFactura].[TipDoc]=[Trn_Vencimientos].[TipDoc] AND
[Trn_RecFactura].[Documento]=[Trn_Vencimientos].[Documento]

(13 row(s) affected)

StmtText
-
-
-
-

ELSE
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_R

(1 row(s) affected)

StmtText
-
-
-
-
|--Index
Update(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[IX_Trn_VencimientosValorA
bono]), SET:([Item1015]=[Trn_Vencimientos].[Item],
[IdCia1014]=[Trn_Vencimientos].[IdCia],
[Documento1013]=[Trn_Vencimientos].[Documento], [ValorAbono1011]=Rai
|--Sort(ORDER BY:([Trn_Vencimientos].[ValorAbono] ASC,
[Trn_Vencimientos].[TipDoc] ASC, [Trn_Vencimientos].[Documento] ASC,
[Trn_Vencimientos].[IdCia] ASC, [Trn_Vencimientos].[Item] ASC, [Bmk1003]
ASC, [Act1009] ASC))
|--Split
|--Assert(WHERE:(If (([Expr1008]>=0.00 AND
[Expr1008]<=[Trn_Vencimientos].[ValorFactura]+1.00)=0) then 0 else NULL))
|--Clustered Index
Update(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
SET:([Trn_Vencimientos].[ValorAbono]=RaiseIfNull([Expr1008])))
|--Compute
Scalar(DEFINE:([Expr1008]=isnull([Expr1006], 0.00)))
|--Parallelism(Gather Streams)
|--Hash Match(Right Outer
Join, HASH:([Trn_RecFactura].[TipDoc], [Trn_RecFactura].[Documento],
[Trn_RecFactura].[IdCiaDoc],
[Trn_RecFactura].[ItemDoc])=([Trn_Vencimientos].[TipDoc],
[Trn_Vencimientos].[Documen

|--Parallelism(Repartition Streams, PARTITION
COLUMNS:([Trn_RecFactura].[TipDoc], [Trn_RecFactura].[Documento],
[Trn_RecFactura].[IdCiaDoc], [Trn_RecFactura].[ItemDoc]))
| |--Clustered Index
Scan(OBJECT:([dbBusNT].[dbo].[Trn_RecFactura].[PK_Trn_RecFactura]))

|--Parallelism(Distribute Streams, PARTITION
COLUMNS:([Trn_Vencimientos].[TipDoc], [Trn_Vencimientos].[Documento],
[Trn_Vencimientos].[IdCia], [Trn_Vencimientos].[Item]))
|--Top(ROWCOUNT est
0)

|--Parallelism(Gather Streams)

|--Filter(WHERE:((like([Trn_Vencimientos].[IdCia], isnull([@pmIdCia],
[Trn_Vencimientos].[IdCia]), NULL) AND like([Trn_Vencimientos].[IdClase],
isnull([@pmIdClase], [Trn_Vencimientos].[IdCl

|--Clustered Index
Scan(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
WHERE:(like([Trn_Vencimientos].[IdVehiculo], isnull([@pmIdVehiculo],
[Trn_Vencimientos].[IdVe

(15 row(s) affected)












=Diego
 

Leer las respuestas

#1 Liliana Sorrentino
21/10/2005 - 17:37 | Informe spam
Hola Diego,
En principio yo borraría el índice generado sobre la columna que estás
actualizando, IX_Trn_VencimientosValorAbono, creo que va a mejorar
sustancialmente.
Liliana.

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

No he podido mejorar este procedimiento; ya le cree indices a todos los
campos que utiliza la clausula WHERE
,se cambie el operador ( = ) por LIKE.

En la tabla Trn_Vencimientos hay mas o menos 250000 registros, y en
Trn_RecFactura hay unos 200000.

Al ejecutar el procedimiento así:
paUpVencimientosApl 'SDD038'
Se está demorando 30 segundos, actualizando mas o menos 800 registro del
vehículo 'SDD038'

¿ Que puedo hacer para reducir el tiempo de ejecución ?

Agradezco su colaboración.

= procedimiento almacenado >
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
AS
IF ISDATE(@pmFechaIni)>0 AND ISDATE(@pmFechaFin)>0--POR FECHA
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)
WHERE FecEmision BETWEEN @pmFechaIni AND @pmFechaFin
AND Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo) AND IdCliente like
ISNULL(@pmIdCliente,IdCliente)
AND IdCia like ISNULL(@pmIdCia,IdCia) AND Trn_Vencimientos.IdClase like
ISNULL(@pmIdClase,Trn_Vencimientos.IdClase) AND TipDoc like
ISNULL(@pmTipDoc,TipDoc)
ELSE
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)
WHERE Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo) AND IdCliente like
ISNULL(@pmIdCliente,IdCliente)
AND IdCia like ISNULL(@pmIdCia,IdCia) AND Trn_Vencimientos.IdClase like
ISNULL(@pmIdClase,Trn_Vencimientos.IdClase) AND TipDoc like
ISNULL(@pmTipDoc,TipDoc)
GO

= PLAN DE EJECUCION ==>
StmtText
SET SHOWPLAN_TEXT ON

(1 row(s) affected)

StmtText
-
paUpVencimientosApl 'SDD038'
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
AS
IF ISDATE(@
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_RecFactu

(3 row(s) affected)

StmtText
-
|--Assert(WHERE:(If (([Expr1008]>=0.00 AND
[Expr1008]<=[Trn_Vencimientos].[ValorFactura]+1.00)=0) then 0 else NULL))
|--Clustered Index
Update(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
SET:([Trn_Vencimientos].[ValorAbono]=RaiseIfNull([Expr1008])))
|--Compute
Scalar(DEFINE:([Expr1008]=isnull([Expr1006], 0.00)))
|--Stream Aggregate(GROUP
BY:([Trn_Vencimientos].[TipDoc], [Trn_Vencimientos].[Documento],
[Trn_Vencimientos].[IdCia], [Trn_Vencimientos].[Item])



DEFINE:([Expr1006]=SUM([Trn_RecFactura].[ValorAbono]-[Trn_RecFactura].[Devol
ucion])
|--Bookmark Lookup(BOOKMARK:([Bmk1004]),
OBJECT:([dbBusNT].[dbo].[Trn_RecFactura]))
|--Parallelism(Gather Streams, ORDER
BY:([Trn_Vencimientos].[TipDoc] ASC, [Trn_Vencimientos].[Documento] ASC,
[Trn_Vencimientos].[IdCia] ASC, [Trn_Vencimientos].[Item] ASC))
|--Nested Loops(Left Outer Join,
OUTER REFERENCES:([Trn_Vencimientos].[Item], [Trn_Vencimientos].[IdCia],
[Trn_Vencimientos].[Documento], [Trn_Vencimientos].[TipDoc]))
|--Parallelism(Distribute
Streams)
| |--Top(ROWCOUNT est 0)
|
|--Parallelism(Gather Streams, ORDER BY:([Trn_Vencimientos].[TipDoc] ASC,
[Trn_Vencimientos].[Documento] ASC, [Trn_Vencimientos].[IdCia] ASC,
[Trn_Vencimientos].[Item] ASC))
|
|--Filter(WHERE:((like([Trn_Vencimientos].[IdCia], isnull([@pmIdCia],
[Trn_Vencimientos].[IdCia]), NULL) AND like([Trn_Vencimientos].[IdClase],
isnull([@pmIdClase], [Trn_Vencimientos].[IdClase])
|
|--Clustered Index
Scan(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
WHERE:((([Trn_Vencimientos].[FecEmision]>=[@pmFechaIni] AND
[Trn_Vencimientos].[FecEmision]<=[@pm
|--Index



Seek(OBJECT:([dbBusNT].[dbo].[Trn_RecFactura].[IX_Trn_RecFacturaDocumento]),
SEEK:([Trn_RecFactura].[TipDoc]=[Trn_Vencimientos].[TipDoc] AND
[Trn_RecFactura].[Documento]=[Trn_Vencimientos].[Documento]

(13 row(s) affected)

StmtText
-

ELSE
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_R

(1 row(s) affected)

StmtText
-
|--Index



Update(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[IX_Trn_VencimientosValorA
bono]), SET:([Item1015]=[Trn_Vencimientos].[Item],
[IdCia1014]=[Trn_Vencimientos].[IdCia],
[Documento1013]=[Trn_Vencimientos].[Documento], [ValorAbono1011]=Rai
|--Sort(ORDER BY:([Trn_Vencimientos].[ValorAbono] ASC,
[Trn_Vencimientos].[TipDoc] ASC, [Trn_Vencimientos].[Documento] ASC,
[Trn_Vencimientos].[IdCia] ASC, [Trn_Vencimientos].[Item] ASC, [Bmk1003]
ASC, [Act1009] ASC))
|--Split
|--Assert(WHERE:(If (([Expr1008]>=0.00 AND
[Expr1008]<=[Trn_Vencimientos].[ValorFactura]+1.00)=0) then 0 else NULL))
|--Clustered Index
Update(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
SET:([Trn_Vencimientos].[ValorAbono]=RaiseIfNull([Expr1008])))
|--Compute
Scalar(DEFINE:([Expr1008]=isnull([Expr1006], 0.00)))
|--Parallelism(Gather Streams)
|--Hash Match(Right Outer
Join, HASH:([Trn_RecFactura].[TipDoc], [Trn_RecFactura].[Documento],
[Trn_RecFactura].[IdCiaDoc],
[Trn_RecFactura].[ItemDoc])=([Trn_Vencimientos].[TipDoc],
[Trn_Vencimientos].[Documen

|--Parallelism(Repartition Streams, PARTITION
COLUMNS:([Trn_RecFactura].[TipDoc], [Trn_RecFactura].[Documento],
[Trn_RecFactura].[IdCiaDoc], [Trn_RecFactura].[ItemDoc]))
| |--Clustered


Index
Scan(OBJECT:([dbBusNT].[dbo].[Trn_RecFactura].[PK_Trn_RecFactura]))

|--Parallelism(Distribute Streams, PARTITION
COLUMNS:([Trn_Vencimientos].[TipDoc], [Trn_Vencimientos].[Documento],
[Trn_Vencimientos].[IdCia], [Trn_Vencimientos].[Item]))
|--Top(ROWCOUNT


est
0)

|--Parallelism(Gather Streams)

|--Filter(WHERE:((like([Trn_Vencimientos].[IdCia], isnull([@pmIdCia],
[Trn_Vencimientos].[IdCia]), NULL) AND like([Trn_Vencimientos].[IdClase],
isnull([@pmIdClase], [Trn_Vencimientos].[IdCl

|--Clustered Index
Scan(OBJECT:([dbBusNT].[dbo].[Trn_Vencimientos].[PK_Trn_Vencimientos]),
WHERE:(like([Trn_Vencimientos].[IdVehiculo], isnull([@pmIdVehiculo],
[Trn_Vencimientos].[IdVe

(15 row(s) affected)












=> Diego


Preguntas similares