my Store procedure spend TOO MANY TIME, why? | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

my Store procedure spend TOO MANY TIME, why?

Hi
I have a sql that return about 35 rows
If I execute that sql in the analizer it spend 4 seconds (with
variables)
If I execute the same sql in a store procedure it spend 35 seconds
(with parameters) The size of the variables or parameters are the same as the columns of the
tables so…
Why it can be? This is the store procedure
I use local variables for to try if it will be faster but it doesn´t
and " WITH RECOMPILE" it is indiferent o worse too, but without it´s the same too. CREATE PROCEDURE BuscardorOfertas
@Campania1 int,
@FechaDesde1 nchar(10),
@FechaHasta1 nchar(10),
@Pais1 nchar(5),
@Ciudad1nchar(5),
@Duracion1 int,
@Precio1 int
WITH RECOMPILE AS DECLARE @PrecioMin int, @PrecioMax int
SET @FechaDesde1 = Right(@FechaDesde1, 4) + ‘-‘ + SubString(@FechaDesde1, 4, 2) + ‘-‘ + Left(@FechaDesde1, 2)
SET @FechaHasta1 = Right(@FechaHasta1, 4) + ‘-‘ + SubString(@FechaHasta1, 4, 2) + ‘-‘ + Left(@FechaHasta1, 2) DECLARE
@Campania int,
@FechaDesde datetime ,
@FechaHasta datetime ,
@Pais nchar(5),
@Ciudadnchar(5),
@Duracion int,
@Precio int declare @MiGetdate datetime SET @FechaDesde =CONVERT(DATETIME, @FechaDesde1, 102)
SET @FechaHasta =CONVERT(DATETIME, @FechaHasta1, 102)
SET @MiGetdate = CONVERT(DATETIME, GETDATE(), 102)
SET @Campania = @Campania1
[email protected] = @Pais1
[email protected]= @Ciudad1
[email protected] [email protected]
[email protected] [email protected]
BEGIN
SET @PrecioMin = 0
SET @PrecioMax = 999999 IF @Precio = 1
BEGIN
SET @PrecioMin = 0
SET @PrecioMax = 300
END
ELSE IF @Precio = 2
BEGIN
SET @PrecioMin = 301
SET @PrecioMax = 600
END
ELSE IF @Precio = 3
BEGIN
SET @PrecioMin = 601
SET @PrecioMax = 900
END
ELSE IF @Precio = 4
BEGIN
SET @PrecioMin = 901
SET @PrecioMax = 1200
END
ELSE IF @Precio = 5
BEGIN
SET @PrecioMin = 1201
SET @PrecioMax = 999999
END SELECT TOP 100 TGENERAL.IDpaquete as IDpaquete , TGENERAL.PVP AS PVP, TGENERAL.IDPVSRC as IDPVSRC , MIN(TGENERAL.IDPVP) as IDPVP, TGENERAL.IDvuelo as IDvuelo, TGENERAL.IDgrupoRC as IDgrupoRC, TGENERAL.IDduracion as IDduracion,
TGENERAL.nombreIDPVSRC AS nombreIDPVSRC, TGENERAL.Ciudad AS Ciudad , Multimedias.url AS URLMULTIMEDIA, Multimedias.ancho as ancho , Multimedias.alto as alto
FROM (
SELECT MIXG.IDpaquete, MIXG.PVP AS PVP, MIXG.IDPVSRC, TABLAPVP.IDPVP, MIXG.IDvuelo, MIXG.IDgrupoRC, MIXG.IDduracion,
MIXG.nombreIDPVSRC AS nombreIDPVSRC, MIXG.Ciudad AS Ciudad FROM (
SELECT TOP 100 MIN(TABLAPVSRC.IDPVSRC) AS IDPVSRC, MIX.IDpaquete, MIX.PVP AS PVP, MIX.IDvuelo, MIX.IDgrupoRC,
MIX.IDduracion, MIX.nombreIDPVSRC AS nombreIDPVSRC, MIX.nombre AS Ciudad
FROM (
SELECT PVSRC.IDpaquete, MIN(PreciosXFechasPVSRC.pvp) AS PVP, PVSRC.IDvuelo,
PVSRC.IDgrupoRC, PVSRC.IDduracion, PVSRC.nombre AS nombreIDPVSRC, Ciudades.nombre
FROM PVSRC INNER JOIN
PreciosXFechasPVSRC ON PVSRC.IDPVSRC = PreciosXFechasPVSRC.IDPVSRC INNER JOIN
Destinos ON PVSRC.IDdestino = Destinos.IDdestino INNER JOIN
Ciudades ON Destinos.IDtipo = Ciudades.IDciudad INNER JOIN
CampaniaPaquete ON PVSRC.IDpaquete = CampaniaPaquete.IDpaquete
WHERE
(PreciosXFechasPVSRC.fechaInicio >= @FechaDesde) AND
(PreciosXFechasPVSRC.fechaInicio <= @FechaHasta) AND
(PreciosXFechasPVSRC.fechaBaja >= @MiGetdate) AND (PreciosXFechasPVSRC.pvp >= @PrecioMin) AND
(PreciosXFechasPVSRC.pvp <= @PrecioMax) AND (CampaniaPaquete.IDcampania = @Campania)
AND (Ciudades.IDCIUDAD = @Ciudad)
GROUP BY PVSRC.IDduracion, PVSRC.nombre, Ciudades.nombre,
PVSRC.IDduracion, PVSRC.IDgrupoRC, PVSRC.IDvuelo, PVSRC.IDpaquete
)
MIX
INNER JOIN
(
SELECT PVSRC.IDPVSRC, PVSRC.IDpaquete, PVSRC.nombre
FROM PVSRC INNER JOIN
PreciosXFechasPVSRC ON PVSRC.IDPVSRC = PreciosXFechasPVSRC.IDPVSRC
WHERE (PreciosXFechasPVSRC.fechaInicio >= @FechaDesde) AND
(PreciosXFechasPVSRC.fechaInicio <= @FechaHasta) AND
(PreciosXFechasPVSRC.fechaBaja >= @MiGetdate) AND (PreciosXFechasPVSRC.pvp >= @PrecioMin) AND
(PreciosXFechasPVSRC.pvp <= @PrecioMax)
GROUP BY PVSRC.IDPVSRC, PVSRC.IDpaquete, PVSRC.nombre
)
TABLAPVSRC
ON MIX.IDpaquete = TABLAPVSRC.IDpaquete AND MIX.nombreIDPVSRC = TABLAPVSRC.nombre
GROUP BY MIX.IDpaquete, MIX.PVP, MIX.IDvuelo, MIX.IDgrupoRC, MIX.IDduracion, MIX.nombreIDPVSRC, MIX.nombre
ORDER BY MIX.PVP
)
MIXG
INNER JOIN
(
SELECT MIN(PreciosXFechasPVSRC.IDprecioXFechaPVSRC) AS IDPVP, PreciosXFechasPVSRC.IDPVSRC, PreciosXFechasPVSRC.pvp,
PVSRC.IDpaquete
FROM PreciosXFechasPVSRC INNER JOIN
PVSRC ON PreciosXFechasPVSRC.IDPVSRC = PVSRC.IDPVSRC
WHERE (PreciosXFechasPVSRC.fechaInicio >= @FechaDesde) AND
(PreciosXFechasPVSRC.fechaInicio <= @FechaHasta) AND
(PreciosXFechasPVSRC.fechaBaja >= @MiGetdate) AND
(PreciosXFechasPVSRC.pvp >= @PrecioMin) AND
(PreciosXFechasPVSRC.pvp <= @PrecioMax)
GROUP BY PreciosXFechasPVSRC.IDPVSRC, PreciosXFechasPVSRC.pvp, PVSRC.IDpaquete
)
TABLAPVP
ON MIXG.IDpaquete = TABLAPVP.IDpaquete AND MIXG.PVP = TABLAPVP.PVP
)
TGENERAL
INNER JOIN PVSRC
ON .PVSRC.IDPVSRC = TGENERAL.IDPVSRC
INNER JOIN
.Multimedias ON .PVSRC.IDmultimedia = .Multimedias.IDmultimedia
WHERE (.Multimedias.IDtipoMultimedia = 0)
GROUP BY TGENERAL.IDpaquete, TGENERAL.PVP , TGENERAL.IDPVSRC, TGENERAL.IDvuelo, TGENERAL.IDgrupoRC, TGENERAL.IDduracion,
TGENERAL.nombreIDPVSRC , TGENERAL.Ciudad , Multimedias.url , Multimedias.ancho, Multimedias.alto, .Multimedias.IDtipoMultimedia
ORDER BY TGENERAL.PVP
RETURN @@ROWCOUNT
END
GO
What do the indexes look like? Have you used the Index Tuning Wizard already?
What’s the execution plan look like in both cases? —
Frank Kalis
Microsoft SQL Server MVP
http://www.insidesql.de
Ich unterstütze PASS Deutschland e.V. http://www.sqlpass.de)

]]>