¿ 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

#11 Saul Batista
24/10/2005 - 11:16 | Informe spam
Diego,

el problema es que falta parte del inner join.
Es que lo tienes asi :

FROM tabla1 INNER JOIN (select .) as Tabla2

pero te falta el ON (tabla1.Campo = Tabla2.Campo )

si lo pones creo que vá a funcionar

Saludos

Saul Batista

"Diego M R®mero" wrote in message
news:%
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
#12 Diego M R®mero
24/10/2005 - 15:56 | Informe spam
Gracias Alenjandro

No sabes cuando me ayudo, son casi 800 sp donde utilizo ISNULL.


Diego


"Alejandro Mesa" escribió en el
mensaje news:
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
> > >
> > >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida