¿ 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

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
22/10/2005 - 05:55 | Informe spam
Diego,

El problema no es el NULL, ni tampoco el LIKE. El problema esta en los
parametros que usas en la funcion ISNULL.

> > 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)



Cuando uno de los parametros es NULL, entonces sql server debe recorrer el
indice o la tabla para comparar uno por uno contra si mismo.

Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo)

Lo que se quiere es que si el valor del parametro @pmIdVehiculo es NULL, que
se tomen en cuenta todos los registros (en otras palabras, que no se tome en
cuenta este filtro), entonces no compares la columna con ella misma, usa un
caracter de expansion o "wild character".

Trn_Vencimientos.IdVehiculo like ISNULL(@pmIdVehiculo, '%')

Lo mismo debes hacer para los otros parametros tipo char / varchar.


AMB

"Diego M R®mero" wrote:

Gracias Liliana

Lo hice, pero sigue igual, se demora 35 seg.
¿ Sera que tiene algo que ver el uso de ISNULL(), en la instrucción WHERE ?

Diego

"Liliana Sorrentino" escribió en el mensaje
news:#
> 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
> >
> >
>
>



Respuesta Responder a este mensaje
#7 Diego M R®mero
22/10/2005 - 16:06 | Informe spam
Alejandro:
Gracias por su colaboración.

cambie la instrucción WHERE

WHERE Trn_Vencimientos.IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND
IdCliente like ISNULL(@pmIdCliente,'%')
AND IdCia like ISNULL(@pmIdCia,'%') AND Trn_Vencimientos.IdClase like
ISNULL(@pmIdClase,'%') AND TipDoc like ISNULL(@pmTipDoc,'%')

pero, en el caso de IdCia, que es CHAR(2), no funciona, da respuesta de 0
filas afectadas.
¿Como lo haría para los campos char ?
y como hago para los campos tipo INT

Diego

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

El problema no es el NULL, ni tampoco el LIKE. El problema esta en los
parametros que usas en la funcion ISNULL.

> > > 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)

Cuando uno de los parametros es NULL, entonces sql server debe recorrer el
indice o la tabla para comparar uno por uno contra si mismo.

Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo)

Lo que se quiere es que si el valor del parametro @pmIdVehiculo es NULL,


que
se tomen en cuenta todos los registros (en otras palabras, que no se tome


en
cuenta este filtro), entonces no compares la columna con ella misma, usa


un
caracter de expansion o "wild character".

Trn_Vencimientos.IdVehiculo like ISNULL(@pmIdVehiculo, '%')

Lo mismo debes hacer para los otros parametros tipo char / varchar.


AMB

"Diego M R®mero" wrote:

> Gracias Liliana
>
> Lo hice, pero sigue igual, se demora 35 seg.
> ¿ Sera que tiene algo que ver el uso de ISNULL(), en la instrucción


WHERE ?
>
> Diego
>
> "Liliana Sorrentino" escribió en el


mensaje
> news:#
> > 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
> > >
> > >
> >
> >
>
>
>
Respuesta Responder a este mensaje
#8 Diego M R®mero
22/10/2005 - 18:00 | Informe spam
Hola
repare el problema con el tipo char, y al ejecutar el procedimiento, se
presenta el siguiente mensaje:

'Warning: Null value is eliminated by an aggregate or other SET operation.'
(836 row(s) affected)


(13 row(s) affected)


¿A qué hacer referencia esto ?

Diego

Procedimiento:

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 IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND IdCliente like
ISNULL(@pmIdCliente,'%') AND IdCia like ISNULL(CAST(@pmIdCia AS
VARCHAR(2)),'%')
AND IdClase like ISNULL(@pmIdClase,'%') AND TipDoc like
ISNULL(@pmTipDoc,'%')
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 IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND IdCliente like
ISNULL(@pmIdCliente,'%')
AND IdClase like ISNULL(@pmIdClase,'%') AND TipDoc like
ISNULL(@pmTipDoc,'%')
AND IdCia like ISNULL(CAST(@pmIdCia AS VARCHAR(2)) ,'%')
GO



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

El problema no es el NULL, ni tampoco el LIKE. El problema esta en los
parametros que usas en la funcion ISNULL.

> > > 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)

Cuando uno de los parametros es NULL, entonces sql server debe recorrer el
indice o la tabla para comparar uno por uno contra si mismo.

Trn_Vencimientos.IdVehiculo like
ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo)

Lo que se quiere es que si el valor del parametro @pmIdVehiculo es NULL,


que
se tomen en cuenta todos los registros (en otras palabras, que no se tome


en
cuenta este filtro), entonces no compares la columna con ella misma, usa


un
caracter de expansion o "wild character".

Trn_Vencimientos.IdVehiculo like ISNULL(@pmIdVehiculo, '%')

Lo mismo debes hacer para los otros parametros tipo char / varchar.


AMB

"Diego M R®mero" wrote:

> Gracias Liliana
>
> Lo hice, pero sigue igual, se demora 35 seg.
> ¿ Sera que tiene algo que ver el uso de ISNULL(), en la instrucción


WHERE ?
>
> Diego
>
>
Respuesta Responder a este mensaje
#9 Diego M R®mero
22/10/2005 - 18:08 | Informe spam
Saul:
Estuve tratando de modificar la siguiente instrucción como usted me dijo,
pero no pude, se genera un error de systanxis cerca del From.
No se como unir la tabla del Update con el SubSelect, como usted lo planteó.


UPDATE Trn_Vencimientos SET ValorAbono= TablaValores.Campo
FROM Trn_Vencimientos INNER JOIN (
SELECT ISNULL(SUM(Trn_RecFactura.ValorAbono-Trn_RecFactura.Devolucion),0) AS
Campo
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) as TablaValores

WHERE IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND IdCliente like
ISNULL(@pmIdCliente,'%')
AND IdClase like ISNULL(@pmIdClase,'%') AND TipDoc like
ISNULL(@pmTipDoc,'%')
AND IdCia like ISNULL(CAST(@pmIdCia AS VARCHAR(2)) ,'%')


Anterior:

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

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 IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND IdCliente like
ISNULL(@pmIdCliente,'%')
AND IdClase like ISNULL(@pmIdClase,'%') AND TipDoc like
ISNULL(@pmTipDoc,'%')
AND IdCia like ISNULL(CAST(@pmIdCia AS VARCHAR(2)) ,'%')



Diego

"Saul Batista" escribió en el mensaje
news:
creo que se cambiares tu UPDATE Tabla SET Campo = (SELECT )

para uno

UPDATE Tabla SET Campo = TablaValores.Campo
FROM Tabla INNER JOIN (
SELECT ..
) as TablaValores
Where

mejorará mucho

Saludos

Saul Batista


"Diego M R®mero" wrote in message
news:
> Gracias Liliana
>
> Lo hice, pero sigue igual, se demora 35 seg.
> ¿ Sera que tiene algo que ver el uso de ISNULL(), en la instrucción


WHERE
> ?
>
> Diego
>
> "Liliana Sorrentino" escribió en el
> mensaje
> news:#
>> 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
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#10 Alejandro Mesa
22/10/2005 - 22:46 | Informe spam
Diego M R®mero,

No te preocupes por ese mensaje, es una advertencia de sql server diciendo
que no toma los valores null en las funciones de agrupacion como sum, avg,
count, etc. Esto o puedes evitar con la funcion "isnull".

SELECT ISNULL(SUM(Trn_RecFactura.ValorAbono-Trn_RecFactura.Devolucion),0)



SELECT
ISNULL(SUM(isnull(Trn_RecFactura.ValorAbono-Trn_RecFactura.Devolucion, 0)),0)
...

¿Como lo haría para los campos char ?

...
and IdCia like ISNULL(@pmIdCia,'%%')

El problema es que sql server espande la cadena '%' a '% ' (la rellena con
espacios a la derecha para que tenga la misma longitud del otro parametro de
"isnull") porque el parametro @pmIdCia es char(2). Yo no se si esto es un bug
de sql server, pero lo puedes ver en el plan de ejecucion.

y como hago para los campos tipo INT?

Con los enteros debes de jugar con la cuota minima y maxima del dominio de
la columna. Por ejemplo, si la columna es "int identity(1, 1)", entonces el
rango posible de esta columna es desde 1 hasta el maximo entero permitido por
lo que puedes usar:

...
and (columna_entera >= coalesce(@parametro_entero, 1) and columna_entera <=
2147483647)


Aca te paso link de un estupendo articulo sobre el tema de busqueda
dinamica en sql server.

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


AMB

"Diego M R®mero" wrote:

Hola
repare el problema con el tipo char, y al ejecutar el procedimiento, se
presenta el siguiente mensaje:

'Warning: Null value is eliminated by an aggregate or other SET operation.'
(836 row(s) affected)


(13 row(s) affected)


¿A qué hacer referencia esto ?

Diego

Procedimiento:

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 IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND IdCliente like
ISNULL(@pmIdCliente,'%') AND IdCia like ISNULL(CAST(@pmIdCia AS
VARCHAR(2)),'%')
AND IdClase like ISNULL(@pmIdClase,'%') AND TipDoc like
ISNULL(@pmTipDoc,'%')
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 IdVehiculo like ISNULL(@pmIdVehiculo,'%') AND IdCliente like
ISNULL(@pmIdCliente,'%')
AND IdClase like ISNULL(@pmIdClase,'%') AND TipDoc like
ISNULL(@pmTipDoc,'%')
AND IdCia like ISNULL(CAST(@pmIdCia AS VARCHAR(2)) ,'%')
GO



"Alejandro Mesa" escribió en el
mensaje news:
> Diego,
>
> El problema no es el NULL, ni tampoco el LIKE. El problema esta en los
> parametros que usas en la funcion ISNULL.
>
> > > > 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)
>
> Cuando uno de los parametros es NULL, entonces sql server debe recorrer el
> indice o la tabla para comparar uno por uno contra si mismo.
>
> Trn_Vencimientos.IdVehiculo like
> ISNULL(@pmIdVehiculo,Trn_Vencimientos.IdVehiculo)
>
> Lo que se quiere es que si el valor del parametro @pmIdVehiculo es NULL,
que
> se tomen en cuenta todos los registros (en otras palabras, que no se tome
en
> cuenta este filtro), entonces no compares la columna con ella misma, usa
un
> caracter de expansion o "wild character".
>
> Trn_Vencimientos.IdVehiculo like ISNULL(@pmIdVehiculo, '%')
>
> Lo mismo debes hacer para los otros parametros tipo char / varchar.
>
>
> AMB
>
> "Diego M R®mero" wrote:
>
> > Gracias Liliana
> >
> > Lo hice, pero sigue igual, se demora 35 seg.
> > ¿ Sera que tiene algo que ver el uso de ISNULL(), en la instrucción
WHERE ?
> >
> > Diego
> >
> >



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