Diferecia de rendimiento en el analizador de consultas y un procedimiento almacenado.

19/09/2005 - 10:24 por José Antonio | Informe spam
Hola, tengo unas consultas que funcionan correctamente en el analizador de
consultas, sin embargo cuando las añado a la base de datos en un
procedimiento almacenado, van mucho mas lentas.

Los planes de ejecución son diferentes tambien en el analizador de consultas
si ejecuto directamente el codigo del procedemiento que si llamo el
procedimiento con exe y los parametros, ademas de la diferencia en los
planes de ejecución, en los planes de ejecucion de llamada al procedimiento
con exec, los iconos tienen todos un circulo amarillo con unas flechas en
medio y aparacen uncos icnos de paralelismo que no habias visto nunca.

Estas son las llamadas que hago.

SET STATISTICS IO ON

DECLARE @CLIENTE VARCHAR(10)
SET @CLIENTE='4300000486'

// Esta es la llamada directa que va lenta.

EXEC DR_ELEPENCLIACU @CLIENTE

//Esta es la llamadirecta y el contenido del procedimiento almacenado es
identico.

SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE L.TIPO='M' AND
L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN ('L','S','F','M','H')
GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON MU.REFERENCIA=P.CODIGO LEFT JOIN MAQUINA M ON
M.CODIGO=MU.CODIGO

SELECT P.CODIGO,MEDIO.NOMBRE,P.ALQUILADO,P.DEVUELTO,P.PENDIENTE FROM
(SELECT L.CODIGO,SUM(CANTIDAD) AS ALQUILADO,SUM(CANTIDEVO) AS
DEVUELTO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE L.TIPO='A' AND
L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN ('L','S','F','M','H')
GROUP BY L.CODIGO) P
LEFT JOIN MEDIO ON MEDIO.CODIGO=P.CODIGO

SELECT P.CODIGO,SERVICIO.NOMBRE,P.ALQUILADO,P.DEVUELTO,P.PENDIENTE FROM
(SELECT L.CODIGO,SUM(CANTIDAD) AS ALQUILADO,SUM(CANTIDEVO) AS
DEVUELTO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE L.TIPO='S' AND
L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN ('L','S','F','M','H')
GROUP BY L.CODIGO) P
LEFT JOIN SERVICIO ON SERVICIO.CODIGO=P.CODIGO
UNION ALL
SELECT L.CODIGO,L.TEXTO,CANTIDAD AS ALQUILADO,CANTIDEVO AS
DEVUELTO,PENDIDEVO AS PENDIENTE FROM LICONTRATO L WHERE L.TIPO='T' AND
L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN ('L','S','F','M','H')


Estos son los resultados del STATISTICS IO:

//La llamada al procedimiento almacenado:
Tabla 'LICONTRATO'. Número de exploraciones 2, lecturas lógicas 7642,
lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MAQUIUNI'. Número de exploraciones 2, lecturas lógicas 16, lecturas
físicas 0, lecturas anticipadas 0.
Tabla 'MAQUINA'. Número de exploraciones 10, lecturas lógicas 20, lecturas
físicas 0, lecturas anticipadas 0.

Tabla 'LICONTRATO'. Número de exploraciones 2, lecturas lógicas 7642,
lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MEDIO'. Número de exploraciones 10, lecturas lógicas 20, lecturas
físicas 0, lecturas anticipadas 0.

Tabla 'LICONTRATO'. Número de exploraciones 4, lecturas lógicas 15284,
lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MEDIO'. Número de exploraciones 0, lecturas lógicas 0, lecturas
físicas 0, lecturas anticipadas 0.

//La ejecucion directa de la sentencia

Tabla 'MAQUINA'. Número de exploraciones 10, lecturas lógicas 20, lecturas
físicas 0, lecturas anticipadas 0.
Tabla 'MAQUIUNI'. Número de exploraciones 10, lecturas lógicas 20, lecturas
físicas 0, lecturas anticipadas 0.
Tabla 'LICONTRATO'. Número de exploraciones 1, lecturas lógicas 65, lecturas
físicas 0, lecturas anticipadas 0.

Tabla 'MEDIO'. Número de exploraciones 10, lecturas lógicas 20, lecturas
físicas 0, lecturas anticipadas 0.
Tabla 'LICONTRATO'. Número de exploraciones 1, lecturas lógicas 149,
lecturas físicas 0, lecturas anticipadas 0.

Tabla 'LICONTRATO'. Número de exploraciones 2, lecturas lógicas 107,
lecturas físicas 0, lecturas anticipadas 0.
Tabla 'SERVICIO'. Número de exploraciones 0, lecturas lógicas 0, lecturas
físicas 0, lecturas anticipadas 0.


Sabeis alguien que puede estar pasando?, todo esto es en el mismor servidor
y la misma base de datos.


Saludos.

Preguntas similare

Leer las respuestas

#16 Maxi
28/09/2005 - 13:32 | Informe spam
Hola, perdon por no responder antes :(. Hagamos una cosa, anotate mi mail y
sigamos el tema en privado (luego le damos la solucion al foro)


Salu2
Maxi


"José Antonio" escribió en el
mensaje news:e17WXy%
Bueno, ya veo que no hay solución, de todas las maneras gracias por tu
tiempo.

Saludos.
"José Antonio" escribió en el
mensaje news:
Bajando el umbral minimo a cero para utilizar paralelismo los resultados
son iguales a los anteriores (o hay que seshabilitar otra cosa?).

Poniendo para que utilice solo 1 procesador los resultados son los
siguientes:

StmtText

SET STATISTICS PROFILE ON

(1 filas afectadas)

StmtText
-
exec dr_elepencliacu '4300000486'


CREATE PROCEDURE DR_ELEPENCLIACU

@CLIENTE AS VARCHAR(10)
AS
SET NOCOUNT ON

L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE L.TIPO='M'
AND L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN
('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON M

(3 filas afectadas)

StmtText
-
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([MU].[CODIGO]))
|--Sort(ORDER BY:([MU].[CODIGO] ASC))
| |--Hash Match(Left Outer Join,
HASH:([L].[CODIGO])=([MU].[REFERENCIA]),
RESIDUAL:([MU].[REFERENCIA]=[L].[CODIGO]))
| |--Compute Scalar(DEFINE:([Expr1001]=If
([Expr1009]=0) then NULL else [Expr1010]))
| | |--Stream Aggregate(GROUP BY:([L].[CODIGO])
DEFINE:([Expr1009]=COUNT_BIG([L].[PENDIDEVO]),
[Expr1010]=SUM([L].[PENDIDEVO])))
| | |--Sort(ORDER BY:([L].[CODIGO] ASC))
| | |--Filter(WHERE:([L].[DEVUELTO]='N'))
| | |--Compute
Scalar(DEFINE:([L].[DEVUELTO]=If
(LICONTRATO.[CANTIDAD]-LICONTRATO.[CANTIDEVO]>Convert(0)) then 'N' else
'S', [L].[PENDIDEVO]=LICONTRATO.[CANTIDAD]-LICONTRATO.[CANTIDEVO]))
| | |--Clustered Index
Scan(OBJECT:([ALQUISYS].[dbo].[LICONTRATO].[PK_LICONTRATO] AS [L]),
WHERE:(([L].[TIPO]='M' AND [L].[CLIENTE]=[@CLIENTE]) AND
(((([L].[TIPOFAC]='H' OR [L].[TIPOFAC]='M') OR [L].[TIPOFAC]='F')
| |--Compute
Scalar(DEFINE:([MU].[REFERENCIA]=[MU].[CODIGO]+MAQUIUNI.[NUMERO]))
| |--Index
Scan(OBJECT:([ALQUISYS].[dbo].[MAQUIUNI].[IX_MAQUIUNI] AS [MU]))
|--Index Seek(OBJECT:([ALQUISYS].[dbo].[MAQUINA].[MAQUINA43]
AS [M]), SEEK:([M].[CODIGO]=[MU].[CODIGO]) ORDERED FORWARD)

(12 filas afectadas)

StmtText
-

SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE L.TIPO='M'
AND L.DEVUELTO='N' AND CLIENTE='4300000486' AND L.TIPOFAC IN
('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON MU

(1 filas afectadas)

StmtText
-
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([MU].[CODIGO]))
|--Sort(ORDER BY:([MU].[CODIGO] ASC))
| |--Nested Loops(Left Outer Join, OUTER
REFERENCES:([L].[CODIGO]) WITH PREFETCH)
| |--Compute Scalar(DEFINE:([Expr1001]=If ([Expr1011]=0)
then NULL else [Expr1012]))
| | |--Stream Aggregate(GROUP BY:([L].[CODIGO])
DEFINE:([Expr1011]=COUNT_BIG([L].[PENDIDEVO]),
[Expr1012]=SUM([L].[PENDIDEVO])))
| | |--Sort(ORDER BY:([L].[CODIGO] ASC))
| | |--Index
Seek(OBJECT:([ALQUISYS].[dbo].[LICONTRATO].[LICONTRATO2424] AS [L]),
SEEK:([L].[CLIENTE]='4300000486' AND [L].[TIPO]='M' AND [L].[TIPOFAC]='F'
AND [L].[DEVUELTO]='N' OR [L].[CLIENTE]='4300000486' AND [L].[TIPO]='M'
| |--Index
Seek(OBJECT:([ALQUISYS].[dbo].[MAQUIUNI].[MAQUIUNI107] AS [MU]),
SEEK:([MU].[REFERENCIA]=[L].[CODIGO]) ORDERED FORWARD)
|--Index Seek(OBJECT:([ALQUISYS].[dbo].[MAQUINA].[MAQUINA43] AS
[M]), SEEK:([M].[CODIGO]=[MU].[CODIGO]) ORDERED FORWARD)

(9 filas afectadas)

StmtText
SET STATISTICS PROFILE OFF

(1 filas afectadas)






"Maxi" escribió en el mensaje
news:
Tenes razon!! bueno voy a tener q analizar bien el tema!! fijate de
probar una cosa!! deshabilita al servidor de sql el uso de paralelismo
de cpu


Salu2
Maxi


"José Antonio" escribió en el
mensaje news:
No, las filas que salen al mostrar los resultados en texto se refieren
al numero de filas de resultado que tienen los planes de ejecucion.

Las dos consultas devuelven 5 filas y las mismas 5 filas.

Jose Antonio
Maxi" escribió en el mensaje
news:e%
Hola, un detalle q se me paso!! el primer query retorna 15 filas y el
segundo 8, ahi ya no estamos haciendo lo mismo ;-)


Salu2
Maxi


"José Antonio" escribió en el
mensaje news:Oz$
El servidor que tienen dos procesadores tiene el SP4.

El plan que te pase anteriormente corresponde al servidor que tienen
1 solo procesador y SP3, y el que te paso ahora es el que tienen dos
procesadores y SP4.

StmtText

SET STATISTICS PROFILE ON

(1 filas afectadas)

StmtText
-
EXEC DR_ELEPENCLIACU '4300000486'
CREATE PROCEDURE DR_ELEPENCLIACU

@CLIENTE AS VARCHAR(10)
AS
SET NOCOUNT ON

SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='M' AND L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN
('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON M

(3 filas afectadas)

StmtText
-
|--Parallelism(Gather Streams)
|--Nested Loops(Left Outer Join, OUTER
REFERENCES:([MU].[CODIGO]))
|--Hash Match(Left Outer Join,
HASH:([L].[CODIGO])=([MU].[REFERENCIA]),
RESIDUAL:([MU].[REFERENCIA]=[L].[CODIGO]))
| |--Bitmap(HASH:([L].[CODIGO]),
DEFINE:([Bitmap1011]))
| | |--Compute Scalar(DEFINE:([Expr1001]=If
([Expr1009]=0) then NULL else [Expr1010]))
| | |--Stream Aggregate(GROUP
BY:([L].[CODIGO]) DEFINE:([Expr1009]=COUNT_BIG([L].[PENDIDEVO]),
[Expr1010]=SUM([L].[PENDIDEVO])))
| | |--Sort(ORDER BY:([L].[CODIGO]
ASC))
| | |--Parallelism(Repartition
Streams, PARTITION COLUMNS:([L].[CODIGO]))
| | |--Filter(WHERE:([L].[DEVUELTO]='N'))
| | |--Compute
Scalar(DEFINE:([L].[DEVUELTO]=If
(LICONTRATO.[CANTIDAD]-LICONTRATO.[CANTIDEVO]>Convert(0)) then 'N'
else 'S',
[L].[PENDIDEVO]=LICONTRATO.[CANTIDAD]-LICONTRATO.[CANTIDEVO]))
| | |--Clustered
Index Scan(OBJECT:([ALQUISYS].[dbo].[LICONTRATO].[PK_LICONTRATO] AS
[L]), WHERE:(([L].[TIPO]='M' AND [L].[CLIENTE]=[@CLIENTE]) AND
(((([L].[TIPOFAC]='H' OR [L].[TIPOFAC]='M') OR [L].[TIP
| |--Parallelism(Repartition Streams, PARTITION
COLUMNS:([MU].[REFERENCIA]), WHERE:(PROBE([Bitmap1011])=TRUE))
| |--Compute
Scalar(DEFINE:([MU].[REFERENCIA]=[MU].[CODIGO]+MAQUIUNI.[NUMERO]))
| |--Index
Scan(OBJECT:([ALQUISYS].[dbo].[MAQUIUNI].[IX_MAQUIUNI] AS [MU]))
|--Index
Seek(OBJECT:([ALQUISYS].[dbo].[MAQUINA].[MAQUINA43] AS [M]),
SEEK:([M].[CODIGO]=[MU].[CODIGO]) ORDERED FORWARD)

(15 filas afectadas)

StmtText
-

SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='M' AND L.DEVUELTO='N' AND CLIENTE='4300000486' AND L.TIPOFAC
IN ('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON MU

(1 filas afectadas)

StmtText
-
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([MU].[CODIGO]))
|--Nested Loops(Left Outer Join, OUTER
REFERENCES:([L].[CODIGO]) WITH PREFETCH)
| |--Compute Scalar(DEFINE:([Expr1001]=If ([Expr1009]=0)
then NULL else [Expr1010]))
| | |--Stream Aggregate(GROUP BY:([L].[CODIGO])
DEFINE:([Expr1009]=COUNT_BIG([L].[PENDIDEVO]),
[Expr1010]=SUM([L].[PENDIDEVO])))
| | |--Sort(ORDER BY:([L].[CODIGO] ASC))
| | |--Index
Seek(OBJECT:([ALQUISYS].[dbo].[LICONTRATO].[LICONTRATO2424] AS [L]),
SEEK:([L].[CLIENTE]='4300000486' AND [L].[TIPO]='M' AND
[L].[TIPOFAC]='F' AND [L].[DEVUELTO]='N' OR
[L].[CLIENTE]='4300000486' AND [L].[TIPO]='M' AND [
| |--Index
Seek(OBJECT:([ALQUISYS].[dbo].[MAQUIUNI].[MAQUIUNI107] AS [MU]),
SEEK:([MU].[REFERENCIA]=[L].[CODIGO]) ORDERED FORWARD)
|--Index Seek(OBJECT:([ALQUISYS].[dbo].[MAQUINA].[MAQUINA43] AS
[M]), SEEK:([M].[CODIGO]=[MU].[CODIGO]) ORDERED FORWARD)

(8 filas afectadas)

StmtText
SET STATISTICS PROFILE OFF

(1 filas afectadas)


"Maxi" escribió en el mensaje
news:
Jose, me podes pasar el plan de ejecucion del otro servidor? el de
sp3 con un solo procesador


Salu2
Maxi


"Jose Antonio" escribió en el mensaje
news:
El resultado del select property es en un servidor SP3, y ahora
tengo que probar en el otro que tiene servipack 4,
tengo el mismo fallo en los dos servidores (he copiado la base de
datos y esta identica en ambos).

El servidor que tiene SP3 es un Pentium 4 con 1 Gb de memoria y
el que tengo con SP4 es un doble pentiumIII con 2 Gb de memoria, la
base de datos es pequeña tienen 2 Gb aproximadamente.

Saludos.
"Maxi" escribió en el mensaje
news:%
Hola, te hago una pregunta!! tenes mas de un procesador en ese
servidor? me podrias ademas decir los resultados de la siguiente
intruccion

Select Serverproperty('ProductLevel')



Salu2
Maxi


"Jose Antonio" escribió en el mensaje
news:e3eQq$
Ya he localizado como era, estos son los resultados.


StmtText

SET STATISTICS PROFILE ON

(1 filas afectadas)

StmtText
-
exec DR_PRUEBA '4300000486'
CREATE PROCEDURE DR_PRUEBA

@CLIENTE AS VARCHAR(10)
AS
SET NOCOUNT ON
SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='M' AND L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC
IN ('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON M

(3 filas afectadas)

StmtText
-
|--Parallelism(Gather Streams, ORDER BY:([MU].[CODIGO]
ASC))
|--Sort(ORDER BY:([MU].[CODIGO] ASC))
|--Nested Loops(Left Outer Join, OUTER
REFERENCES:([MU].[CODIGO]))
|--Hash Match(Left Outer Join,
HASH:([L].[CODIGO])=([MU].[REFERENCIA]),
RESIDUAL:([MU].[REFERENCIA]=[L].[CODIGO]))
| |--Bitmap(HASH:([L].[CODIGO]),
DEFINE:([Bitmap1011]))
| | |--Compute
Scalar(DEFINE:([Expr1001]=If ([Expr1009]=0) then NULL else
[Expr1010]))
| | |--Stream Aggregate(GROUP
BY:([L].[CODIGO]) DEFINE:([Expr1009]=COUNT_BIG([L].[PENDIDEVO]),
[Expr1010]=SUM([L].[PENDIDEVO])))
| | |--Sort(ORDER
BY:([L].[CODIGO] ASC))
| | |--Parallelism(Repartition Streams,
PARTITION COLUMNS:([L].[CODIGO]))
| | |--Filter(WHERE:([L].[DEVUELTO]='N'))
| |
|--Compute Scalar(DEFINE:([L].[DEVUELTO]=If
(LICONTRATO.[CANTIDAD]-LICONTRATO.[CANTIDEVO]>Convert(0)) then
'N' else 'S',
[L].[PENDIDEVO]=LICONTRATO.[CANTIDAD]-LICONTRATO.[CANTIDEVO]))
| | |--Clustered Index
Scan(OBJECT:([ALQUISYS].[dbo].[LICONTRATO].[PK_LICONTRATO] AS
[L]), WHERE:(([L].[TIPO]='M' AND [L].[CLIENTE]=[@CLIENTE]) AND
(((([L].[TIPOFAC]='H' OR [L].[TIPOFAC]='M') OR [L]
| |--Parallelism(Repartition Streams,
PARTITION COLUMNS:([MU].[REFERENCIA]),
WHERE:(PROBE([Bitmap1011])=TRUE))
| |--Compute
Scalar(DEFINE:([MU].[REFERENCIA]=[MU].[CODIGO]+MAQUIUNI.[NUMERO]))
| |--Index
Scan(OBJECT:([ALQUISYS].[dbo].[MAQUIUNI].[IX_MAQUIUNI] AS [MU]))
|--Index
Seek(OBJECT:([ALQUISYS].[dbo].[MAQUINA].[MAQUINA43] AS [M]),
SEEK:([M].[CODIGO]=[MU].[CODIGO]) ORDERED FORWARD)

(16 filas afectadas)

StmtText
-

SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='M' AND L.DEVUELTO='N' AND CLIENTE='4300000486' AND
L.TIPOFAC IN ('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON MU

(1 filas afectadas)

StmtText
-
|--Nested Loops(Left Outer Join, OUTER
REFERENCES:([MU].[CODIGO]))
|--Sort(ORDER BY:([MU].[CODIGO] ASC))
| |--Nested Loops(Left Outer Join, OUTER
REFERENCES:([L].[CODIGO]) WITH PREFETCH)
| |--Compute Scalar(DEFINE:([Expr1001]=If
([Expr1011]=0) then NULL else [Expr1012]))
| | |--Stream Aggregate(GROUP BY:([L].[CODIGO])
DEFINE:([Expr1011]=COUNT_BIG([L].[PENDIDEVO]),
[Expr1012]=SUM([L].[PENDIDEVO])))
| | |--Sort(ORDER BY:([L].[CODIGO] ASC))
| | |--Index
Seek(OBJECT:([ALQUISYS].[dbo].[LICONTRATO].[LICONTRATO2424] AS
[L]), SEEK:([L].[CLIENTE]='4300000486' AND [L].[TIPO]='M' AND
[L].[TIPOFAC]='F' AND [L].[DEVUELTO]='N' OR
[L].[CLIENTE]='4300000486' AND [L].[TIPO]='M'
| |--Index
Seek(OBJECT:([ALQUISYS].[dbo].[MAQUIUNI].[MAQUIUNI107] AS [MU]),
SEEK:([MU].[REFERENCIA]=[L].[CODIGO]) ORDERED FORWARD)
|--Index
Seek(OBJECT:([ALQUISYS].[dbo].[MAQUINA].[MAQUINA43] AS [M]),
SEEK:([M].[CODIGO]=[MU].[CODIGO]) ORDERED FORWARD)

(9 filas afectadas)

StmtText
SET STATISTICS PROFILE OFF

(1 filas afectadas)





"Maxi" escribió en el mensaje
news:%
Hola, a ver, solo deja un solo query en el SP y compilalo. Luego
ejecutalo y mostrame el plan de ejecucion (pasamelo en formato
texto) al igual que el mismo query fuera del Sp's (armate un
archivo .txt para la data)

Tenes alguna maquina con sp3a?


Salu2
Maxi


"José Antonio" escribió
en el mensaje news:
Tengo instalado el servipack 4, y creo que si estan
actualizadas las estadisticas.

En todo caso ¿como las actualizaria? para probar si es ese el
problema.

voy a probar a separar los querys y te digo que es lo que
pasa.


"Maxi" escribió en el mensaje
news:eZG2q$
Hola, que vsersion de service pack tienes? y ademas, las
estadisticas las tienes actualizadas?

El sp's tiene los 3 querys juntos? podes probar de separarlos
uno por sp?


-

"José Antonio"
escribió en el mensaje
news:
Hola, tengo unas consultas que funcionan correctamente en el
analizador de consultas, sin embargo cuando las añado a la
base de datos en un procedimiento almacenado, van mucho mas
lentas.

Los planes de ejecución son diferentes tambien en el
analizador de consultas si ejecuto directamente el codigo del
procedemiento que si llamo el procedimiento con exe y los
parametros, ademas de la diferencia en los planes de
ejecución, en los planes de ejecucion de llamada al
procedimiento con exec, los iconos tienen todos un circulo
amarillo con unas flechas en medio y aparacen uncos icnos de
paralelismo que no habias visto nunca.

Estas son las llamadas que hago.

SET STATISTICS IO ON

DECLARE @CLIENTE VARCHAR(10)
SET @CLIENTE='4300000486'

// Esta es la llamada directa que va lenta.

EXEC DR_ELEPENCLIACU @CLIENTE

//Esta es la llamadirecta y el contenido del procedimiento
almacenado es identico.

SELECT MU.CODIGO,M.NOMBRE,P.PENDIENTE FROM (SELECT
L.CODIGO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='M' AND L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND
L.TIPOFAC IN ('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MAQUIUNI MU ON MU.REFERENCIA=P.CODIGO LEFT JOIN
MAQUINA M ON M.CODIGO=MU.CODIGO

SELECT
P.CODIGO,MEDIO.NOMBRE,P.ALQUILADO,P.DEVUELTO,P.PENDIENTE FROM
(SELECT L.CODIGO,SUM(CANTIDAD) AS ALQUILADO,SUM(CANTIDEVO) AS
DEVUELTO,SUM(PENDIDEVO) AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='A' AND L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND
L.TIPOFAC IN ('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN MEDIO ON MEDIO.CODIGO=P.CODIGO

SELECT
P.CODIGO,SERVICIO.NOMBRE,P.ALQUILADO,P.DEVUELTO,P.PENDIENTE
FROM (SELECT L.CODIGO,SUM(CANTIDAD) AS
ALQUILADO,SUM(CANTIDEVO) AS DEVUELTO,SUM(PENDIDEVO) AS
PENDIENTE FROM LICONTRATO L WHERE L.TIPO='S' AND
L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND L.TIPOFAC IN
('L','S','F','M','H') GROUP BY L.CODIGO) P
LEFT JOIN SERVICIO ON SERVICIO.CODIGO=P.CODIGO
UNION ALL
SELECT L.CODIGO,L.TEXTO,CANTIDAD AS ALQUILADO,CANTIDEVO AS
DEVUELTO,PENDIDEVO AS PENDIENTE FROM LICONTRATO L WHERE
L.TIPO='T' AND L.DEVUELTO='N' AND CLIENTE=@CLIENTE AND
L.TIPOFAC IN ('L','S','F','M','H')


Estos son los resultados del STATISTICS IO:

//La llamada al procedimiento almacenado:
Tabla 'LICONTRATO'. Número de exploraciones 2, lecturas
lógicas 7642, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MAQUIUNI'. Número de exploraciones 2, lecturas lógicas
16, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MAQUINA'. Número de exploraciones 10, lecturas lógicas
20, lecturas físicas 0, lecturas anticipadas 0.

Tabla 'LICONTRATO'. Número de exploraciones 2, lecturas
lógicas 7642, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MEDIO'. Número de exploraciones 10, lecturas lógicas
20, lecturas físicas 0, lecturas anticipadas 0.

Tabla 'LICONTRATO'. Número de exploraciones 4, lecturas
lógicas 15284, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MEDIO'. Número de exploraciones 0, lecturas lógicas 0,
lecturas físicas 0, lecturas anticipadas 0.

//La ejecucion directa de la sentencia

Tabla 'MAQUINA'. Número de exploraciones 10, lecturas lógicas
20, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'MAQUIUNI'. Número de exploraciones 10, lecturas
lógicas 20, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'LICONTRATO'. Número de exploraciones 1, lecturas
lógicas 65, lecturas físicas 0, lecturas anticipadas 0.

Tabla 'MEDIO'. Número de exploraciones 10, lecturas lógicas
20, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'LICONTRATO'. Número de exploraciones 1, lecturas
lógicas 149, lecturas físicas 0, lecturas anticipadas 0.

Tabla 'LICONTRATO'. Número de exploraciones 2, lecturas
lógicas 107, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'SERVICIO'. Número de exploraciones 0, lecturas lógicas
0, lecturas físicas 0, lecturas anticipadas 0.


Sabeis alguien que puede estar pasando?, todo esto es en el
mismor servidor y la misma base de datos.


Saludos.






















































email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida