Problema en sp con campo tipo fecha

28/07/2004 - 05:33 por José David Galviz M | Informe spam
Compañeros, tengo el siguiente problema, tengo este sp

CREATE PROCEDURE fw_Get_Resumen_Recaudos_prueba
AS
BEGIN
DECLARE
@Estacion INT,
@FechaI VARCHAR(10),
@FechaF VARCHAR(10),
@Financiera INT

SELECT @FechaI= '20040601', @FechaF= '20040601'


SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
FROM venventas V, venCreditos P, admPuntoComunicacion E, genFinanciera F
WHERE V.IdCredito = P.IdCredito AND
V.IdEstacion= E.IdPunto AND
P.IdFinanciera= F.IdFinanciera AND
V.ValTotalCuota > 0 AND
V.ValGranTotal > 0 AND
V.FecFechaEmiVen >= @FechaI AND -- esta
V.FecFechaEmiVen <= @FechaF --y esta
GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto
END

Al ejecutar el sp así como esta me devuelve los datos en 5 minutos, pero si
reemplazo en las dos lineas marcadas @fechaI y @fechaf por '20040601', me
retorna los datos en 9 segundos, alguna idea de porque sucede esto?

Gracias de antemano

ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella

Preguntas similare

Leer las respuestas

#6 José David Galviz M
28/07/2004 - 18:35 | Informe spam
Maxi, como el servidor de noticias no recibe adjuntos :( puedes descargarlos
de:

http://www.geocities.com/miprimoelb...owplan.zip

ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella

"José David Galviz M" escribió en el mensaje
news:
Maxi, olvide decirte, el problema lo reduje simplemente a esta consulta:

DECLARE @FechaI VARCHAR(10), @FechaF VARCHAR(10)

SELECT @FechaI= '20040601', @FechaF= '20040601'

SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
FROM venventas V, venCreditos P, admPuntoComunicacion E, genFinanciera F
WHERE V.IdCredito = P.IdCredito AND
V.IdEstacion= E.IdPunto AND
P.IdFinanciera= F.IdFinanciera AND
V.ValTotalCuota > 0 AND
V.ValGranTotal > 0 AND
V.FecFechaEmiVen >= '20040601' AND
V.FecFechaEmiVen <= '20040601'
GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto



ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella


"Maxi" escribió en el mensaje
news:
> Hola amigo!!! hmm es como que no estaria usando los indices :(, podrias
> copiar cada plan de ejecucion aqui? asi vemos que hace :-)
>
> Un abrazo
>
>
> Salu2
> Maxi
> Buenos Aires - Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> Nunca consideres el estudio como una obligación sino como
> una oportunidad para penetrar en el bello y maravillosos
> mundo del saber.
> - Albert Einstein
>
>
>
> "José David Galviz M" escribió en el mensaje
> news:OC%
> > Compañeros, tengo el siguiente problema, tengo este sp
> >
> > CREATE PROCEDURE fw_Get_Resumen_Recaudos_prueba
> > AS
> > BEGIN
> > DECLARE
> > @Estacion INT,
> > @FechaI VARCHAR(10),
> > @FechaF VARCHAR(10),
> > @Financiera INT
> >
> > SELECT @FechaI= '20040601', @FechaF= '20040601'
> >
> >
> > SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
> > SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
> > FROM venventas V, venCreditos P, admPuntoComunicacion E, genFinanciera


F
> > WHERE V.IdCredito = P.IdCredito AND
> > V.IdEstacion= E.IdPunto AND
> > P.IdFinanciera= F.IdFinanciera AND
> > V.ValTotalCuota > 0 AND
> > V.ValGranTotal > 0 AND
> > V.FecFechaEmiVen >= @FechaI AND -- esta
> > V.FecFechaEmiVen <= @FechaF --y esta
> > GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
> > ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto
> > END
> >
> > Al ejecutar el sp así como esta me devuelve los datos en 5 minutos,


pero
> si
> > reemplazo en las dos lineas marcadas @fechaI y @fechaf por '20040601',
me
> > retorna los datos en 9 segundos, alguna idea de porque sucede esto?
> >
> > Gracias de antemano
> >
> > ING. JOSE DAVID GALVIZ MUÑOZ
> > MCAD
> > DCE Tercera Estrella
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.722 / Virus Database: 478 - Release Date: 18/07/2004
>
>


Respuesta Responder a este mensaje
#7 Javier Loria
28/07/2004 - 21:50 | Informe spam
Hola Jose:
Prueba con lo siguiente:
a) Cambia las variables de fecha por DATETIME o SMALLDATETIME dependiendo de
el tipo de la forma en que este declarada la variable.
b) Cambiar la condicion de Fechas por
=AND V.FecFechaEmiVen BETWEEN @FechaI AND @FechaF
Tal vez el Between ayude.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
José David Galviz M escribio:
Compañeros, tengo el siguiente problema, tengo este sp

CREATE PROCEDURE fw_Get_Resumen_Recaudos_prueba
AS
BEGIN
DECLARE
@Estacion INT,
@FechaI VARCHAR(10),
@FechaF VARCHAR(10),
@Financiera INT

SELECT @FechaI= '20040601', @FechaF= '20040601'


SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
FROM venventas V, venCreditos P, admPuntoComunicacion E,
genFinanciera F WHERE V.IdCredito = P.IdCredito AND
V.IdEstacion= E.IdPunto AND
P.IdFinanciera= F.IdFinanciera AND
V.ValTotalCuota > 0 AND
V.ValGranTotal > 0 AND
V.FecFechaEmiVen >= @FechaI AND -- esta
V.FecFechaEmiVen <= @FechaF --y esta
GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto
END

Al ejecutar el sp así como esta me devuelve los datos en 5 minutos,
pero si reemplazo en las dos lineas marcadas @fechaI y @fechaf por
'20040601', me retorna los datos en 9 segundos, alguna idea de porque
sucede esto?

Gracias de antemano
Respuesta Responder a este mensaje
#8 José David Galviz M
29/07/2004 - 00:22 | Informe spam
Nada Javier. Haciendo esto sigue igual.

Ahora hice mas pequeña la sql (sigue pasando lo mismo pero es mas
entendible)

DECLARE @FechaI SMALLDATETIME, @FechaF SMALLDATETIME

SELECT @FechaI= '20040601', @FechaF= '20040601 23:59:00'

SELECT *
FROM venventas V
WHERE V.FecFechaEmiVen >= @FechaI AND
V.FecFechaEmiVen <= @FechaF AND
V.ValTotalCuota > 0 AND
V.ValGranTotal > 0

Lo sumamente extraño es que los planos de ejecución son diferentes (me
disculapn el formato):

En el caso de usar las variables @fecha hace esto (esta es la lenta (5
minutos):

|--Clustered Index Scan(OBJECT:([gnc].[dbo].[venVentas].[IX_venVentas_2] AS
[V]), WHERE:((([V].[FecFechaEmiVen]>=[@FechaI] AND
[V].[FecFechaEmiVen]<=[@FechaF]) AND [V].[ValTotalCuota]>0) AND
[V].[ValGranTotal]>0)) 50 4 2 Clustered Index
Scan Clustered Index Scan
OBJECT:([gnc].[dbo].[venVentas].[IX_venVentas_2] AS [V]),
WHERE:((([V].[FecFechaEmiVen]>=[@FechaI] AND
[V].[FecFechaEmiVen]<=[@FechaF]) AND [V].[ValTotalCuota]>0) AND
[V].[ValGranTotal]>0) [V].[TipoAuto], [V].[ValDevuelto], [V].[NumPlaca],
[V].[IdUsuario], [V].[FecUltActualizacion], [V].[IndHabilitado],
[V].[FecFecha], [V].[NumRegistro], [V].[CodManguera], [V].[CodIsla],
[V].[IdEstacion], [V].[IdSucursal], [V].[IdTarjetaIsl], [V].[IndAnulado
189622.91 424.95313 8.2090282
274 433.16217 [V].[TipoAuto], [V].[ValDevuelto],
[V].[NumPlaca], [V].[IdUsuario], [V].[FecUltActualizacion],
[V].[IndHabilitado], [V].[FecFecha], [V].[NumRegistro], [V].[CodManguera],
[V].[CodIsla], [V].[IdEstacion], [V].[IdSucursal], [V].[IdTarjetaIsl],
[V].[IndAnulado NULL PLAN_ROW 0 1.0

Cuando no uso las variables hace esto (Esta es la forma rápida 9 segundos):

|--Filter(WHERE:([V].[ValTotalCuota]>Convert([@3]) AND
[V].[ValGranTotal]>Convert([@4])))
53 3 1 Filter Filter
WHERE:([V].[ValTotalCuota]>Convert([@3]) AND
[V].[ValGranTotal]>Convert([@4]))
NULL
1.0 0.0 8.8000002E-7
274 1.2660087E-2 [V].[TipoAuto], [V].[ValDevuelto],
[V].[NumPlaca], [V].[IdUsuario], [V].[FecUltActualizacion],
[V].[IndHabilitado], [V].[FecFecha], [V].[NumRegistro], [V].[CodManguera],
[V].[CodIsla], [V].[IdEstacion], [V].[IdSucursal], [V].[IdTarjetaIsl],
[V].[IndAnulado NULL PLAN_ROW 0 1.0
|--Bookmark Lookup(BOOKMARK:([Bmk1000]),
OBJECT:([gnc].[dbo].[venVentas] AS [V]))
53 4 3 Bookmark Lookup Bookmark
Lookup BOOKMARK:([Bmk1000]), OBJECT:([gnc].[dbo].[venVentas]
AS [V])
[V].[TipoAuto], [V].[ValDevuelto], [V].[NumPlaca], [V].[IdUsuario],
[V].[FecUltActualizacion], [V].[IndHabilitado], [V].[FecFecha],
[V].[NumRegistro], [V].[CodManguera], [V].[CodIsla], [V].[IdEstacion],
[V].[IdSucursal], [V].[IdTarjetaIsl], [V].[IndAnulado 1.0
6.2500001E-3 0.0000011 274 1.2659207E-2
[V].[TipoAuto], [V].[ValDevuelto], [V].[NumPlaca], [V].[IdUsuario],
[V].[FecUltActualizacion], [V].[IndHabilitado], [V].[FecFecha],
[V].[NumRegistro], [V].[CodManguera], [V].[CodIsla], [V].[IdEstacion],
[V].[IdSucursal], [V].[IdTarjetaIsl], [V].[IndAnulado NULL PLAN_ROW
0 1.0
|--Index Seek(OBJECT:([gnc].[dbo].[venVentas].[IX_venVentas_3]
AS [V]), SEEK:([V].[FecFechaEmiVen] <= Convert([@2]) AND
[V].[FecFechaEmiVen] >= Convert([@1])) ORDERED FORWARD) 53 5
4 Index Seek Index Seek
OBJECT:([gnc].[dbo].[venVentas].[IX_venVentas_3] AS [V]),
SEEK:([V].[FecFechaEmiVen] <= Convert([@2]) AND [V].[FecFechaEmiVen] >Convert([@1])) ORDERED FORWARD [Bmk1000]
1.0 6.3284999E-3 7.9607002E-5
44 6.408107E-3 [Bmk1000]
NULL PLAN_ROW 0 1.0

ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella
"Javier Loria" escribió en el mensaje
news:u%
Hola Jose:
Prueba con lo siguiente:
a) Cambia las variables de fecha por DATETIME o SMALLDATETIME dependiendo


de
el tipo de la forma en que este declarada la variable.
b) Cambiar la condicion de Fechas por
=> AND V.FecFechaEmiVen BETWEEN @FechaI AND @FechaF
> Tal vez el Between ayude.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
José David Galviz M escribio:
> Compañeros, tengo el siguiente problema, tengo este sp
>
> CREATE PROCEDURE fw_Get_Resumen_Recaudos_prueba
> AS
> BEGIN
> DECLARE
> @Estacion INT,
> @FechaI VARCHAR(10),
> @FechaF VARCHAR(10),
> @Financiera INT
>
> SELECT @FechaI= '20040601', @FechaF= '20040601'
>
>
> SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
> SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
> FROM venventas V, venCreditos P, admPuntoComunicacion E,
> genFinanciera F WHERE V.IdCredito = P.IdCredito AND
> V.IdEstacion= E.IdPunto AND
> P.IdFinanciera= F.IdFinanciera AND
> V.ValTotalCuota > 0 AND
> V.ValGranTotal > 0 AND
> V.FecFechaEmiVen >= @FechaI AND -- esta
> V.FecFechaEmiVen <= @FechaF --y esta
> GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
> ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto
> END
>
> Al ejecutar el sp así como esta me devuelve los datos en 5 minutos,
> pero si reemplazo en las dos lineas marcadas @fechaI y @fechaf por
> '20040601', me retorna los datos en 9 segundos, alguna idea de porque
> sucede esto?
>
> Gracias de antemano


Respuesta Responder a este mensaje
#9 José David Galviz M
29/07/2004 - 01:03 | Informe spam
Me siento al borde de morir :( imagínense que aún haciendo lo siguiente es
más rápido (23 segundos)

DECLARE @sql VARCHAR(5000)

DECLARE @FechaI VARCHAR(8), @FechaF VARCHAR(8)

SELECT @FechaI= '20040601', @FechaF= '20040601'

SELECT @sql= 'SELECT * FROM venventas V WHERE V.FecFechaEmiVen >= ''' +
@FechaI + ''' AND '
SELECT @sql= @sql + ' V.FecFechaEmiVen <= ''' + @FechaF + ''' AND
V.ValTotalCuota > 0 AND V.ValGranTotal > 0'

exec (@sql)


Pero haciendo esto tendría que dar al usuario permisos sobre la tabla, lo
que no es recomendable por SEGURIDAD, yo administro la seguridad basada en
Procedimientos.

Si alguno se le ocurre algo, por favor estoy a la escucha.

ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella

"José David Galviz M" escribió en el mensaje
news:OC%
Compañeros, tengo el siguiente problema, tengo este sp

CREATE PROCEDURE fw_Get_Resumen_Recaudos_prueba
AS
BEGIN
DECLARE
@Estacion INT,
@FechaI VARCHAR(10),
@FechaF VARCHAR(10),
@Financiera INT

SELECT @FechaI= '20040601', @FechaF= '20040601'


SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
FROM venventas V, venCreditos P, admPuntoComunicacion E, genFinanciera F
WHERE V.IdCredito = P.IdCredito AND
V.IdEstacion= E.IdPunto AND
P.IdFinanciera= F.IdFinanciera AND
V.ValTotalCuota > 0 AND
V.ValGranTotal > 0 AND
V.FecFechaEmiVen >= @FechaI AND -- esta
V.FecFechaEmiVen <= @FechaF --y esta
GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto
END

Al ejecutar el sp así como esta me devuelve los datos en 5 minutos, pero


si
reemplazo en las dos lineas marcadas @fechaI y @fechaf por '20040601', me
retorna los datos en 9 segundos, alguna idea de porque sucede esto?

Gracias de antemano

ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella


Respuesta Responder a este mensaje
#10 Liliana Sorrentino
29/07/2004 - 15:22 | Informe spam
Hola,
Tratando de reproducir tu escenario, con índices incluídos, no logro tener
el mismo problema.
Por las dudas ¿las estadísticas están actualizadas?

"José David Galviz M" escribió en el mensaje
news:e2$
Me siento al borde de morir :( imagínense que aún haciendo lo siguiente es
más rápido (23 segundos)

DECLARE @sql VARCHAR(5000)

DECLARE @FechaI VARCHAR(8), @FechaF VARCHAR(8)

SELECT @FechaI= '20040601', @FechaF= '20040601'

SELECT @sql= 'SELECT * FROM venventas V WHERE V.FecFechaEmiVen >= ''' +
@FechaI + ''' AND '
SELECT @sql= @sql + ' V.FecFechaEmiVen <= ''' + @FechaF + ''' AND
V.ValTotalCuota > 0 AND V.ValGranTotal > 0'

exec (@sql)


Pero haciendo esto tendría que dar al usuario permisos sobre la tabla, lo
que no es recomendable por SEGURIDAD, yo administro la seguridad basada en
Procedimientos.

Si alguno se le ocurre algo, por favor estoy a la escucha.

ING. JOSE DAVID GALVIZ MUÑOZ
MCAD
DCE Tercera Estrella

"José David Galviz M" escribió en el mensaje
news:OC%
> Compañeros, tengo el siguiente problema, tengo este sp
>
> CREATE PROCEDURE fw_Get_Resumen_Recaudos_prueba
> AS
> BEGIN
> DECLARE
> @Estacion INT,
> @FechaI VARCHAR(10),
> @FechaF VARCHAR(10),
> @Financiera INT
>
> SELECT @FechaI= '20040601', @FechaF= '20040601'
>
>
> SELECT NomPunto Estacion, NomFinanciera, FecFechaEmiVen Fecha,
> SUM(ValTotalCuota) ValTotalCuota, COUNT(0) Recaudos
> FROM venventas V, venCreditos P, admPuntoComunicacion E, genFinanciera F
> WHERE V.IdCredito = P.IdCredito AND
> V.IdEstacion= E.IdPunto AND
> P.IdFinanciera= F.IdFinanciera AND
> V.ValTotalCuota > 0 AND
> V.ValGranTotal > 0 AND
> V.FecFechaEmiVen >= @FechaI AND -- esta
> V.FecFechaEmiVen <= @FechaF --y esta
> GROUP BY NomPunto, NomFinanciera, FecFechaEmiVen
> ORDER BY FecFechaEmiVen, NomFinanciera, NomPunto
> END
>
> Al ejecutar el sp así como esta me devuelve los datos en 5 minutos, pero
si
> reemplazo en las dos lineas marcadas @fechaI y @fechaf por '20040601',


me
> retorna los datos en 9 segundos, alguna idea de porque sucede esto?
>
> Gracias de antemano
>
> ING. JOSE DAVID GALVIZ MUÑOZ
> MCAD
> DCE Tercera Estrella
>
>


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