Filtro Fechas óptimo

20/10/2008 - 16:21 por Alhambra Eidos Desarrollo | Informe spam
hola a todos,

tengo este filtro en el where,


WHERE
datepart(dayofyear,fecha) >= datepart(dayofyear,@FechaDesde) AND
datepart(dayofyear,fecha) <= datepart(dayofyear,@FechaHasta)

Me comentan que el rendimiento puede ser ineficiente, cómo podría hacerlo
mejor ?

Me dicen que no cumple con SARG pero qué es SARG ?

Gracias !!!
http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.com/churrosoft
http://www.setbb.com/putainformatic...opic.php?p„3
www.trabajobasura.com/solusoft

Preguntas similare

Leer las respuestas

#1 Maxi
20/10/2008 - 18:13 | Informe spam
Hola, cada dayofyear representa una fecha en concreto, entonces yo haria
primero que con cada dayofyear sacar que fechas con exactamente (por
ejemplo: dia 1 01/01/2008 dia 363 31/12/2008

tonces.

Igual me parece que no estas bien usando el concepto de dias vos y realmente
te llegan fecha desde y fecha hasta y consultas ese rango.

Las fechas pasalas en ansi 'yyyymmdd'

where
fecha >= @FechaDesde AND
fecha) <= @FechaHasta




Salu2

Microsoft MVP SQL Server
Culminis Speaker
www.sqltotalconsulting.com

"Alhambra Eidos Desarrollo"
escribió en el mensaje
news:
hola a todos,

tengo este filtro en el where,


WHERE
datepart(dayofyear,fecha) >= datepart(dayofyear,@FechaDesde) AND
datepart(dayofyear,fecha) <= datepart(dayofyear,@FechaHasta)

Me comentan que el rendimiento puede ser ineficiente, cómo podría hacerlo
mejor ?

Me dicen que no cumple con SARG pero qué es SARG ?

Gracias !!!
http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.com/churrosoft
http://www.setbb.com/putainformatic...opic.php?p„3
www.trabajobasura.com/solusoft

Respuesta Responder a este mensaje
#2 Leonardo Azpurua
21/10/2008 - 08:18 | Informe spam
"Alhambra Eidos Desarrollo"
escribió en el mensaje
news:
hola a todos,

tengo este filtro en el where,


WHERE
datepart(dayofyear,fecha) >= datepart(dayofyear,@FechaDesde) AND
datepart(dayofyear,fecha) <= datepart(dayofyear,@FechaHasta)

Me comentan que el rendimiento puede ser ineficiente, cómo podría hacerlo
mejor ?

Me dicen que no cumple con SARG pero qué es SARG ?



Hola,

Coloca un necio en una olla, agrega un sobre de sopa de letras y un litro de
agua, cocina a fuego lento, revolviendo de vez en cuando para que no se
pegue, hasta que comience a hervir y tendrás un analista jefe especialista
en estándares.

Lo único identificado como SARG que aparece en gugle es "Squid Analysis
Report Generator", un proyecto en SourceForge que parece ser muy importante,
pero no creo que tanto para establecer un estandar con el que haya que
cumplir. Aunque no me hagas mucho caso, que en eso de estándares y
tecnologías de bases de datos soy un perfecto asno.

Si estás usando SARG (sea lo que sea eso) y no sabes qué es, ciertamente
tienes un problema, pero esperemos que ese no sea el caso.

Si lo que quieres es una consulta que te dé todas las operaciones de
determinado tipo realizadas en una época particular del año, para todos los
años para los que tienes información almacenada, tu filtro tiene algún
sentido (aunque los años bisiestos tienen una relacion diferente entre Fecha
y DAYOFYEAR que el resto de los años, a partir del 29 de febrero).

Pero si te interesa obtener todos los registros dentro de un rango de
fechas, bastaría con algo tan simple como WHERE Fecha BETWEEN @FechaDesde
AND @FechaHasta.

La ineficiencia resulta del hecho de que no puedes indexar por una función
(coma DATEPART), y si la usas como filtro, es probable que el servidor tenga
que examinar secuencialmente todos los registros de la tabla.

El asunto no siempre es tan dramático. Si el WHERE incluye otras condiciones
basadas en columnas para las que existan indices, el barrido secuencial
sólamente deberá ejecutarse (a menos que SQL Server sea tonto de remate,
cosa improbable) dentro de los registros que satisfagan las otras
condiciones. Y en última instancia, si eso es lo que necesitas, el criterio
es la manera de obtenerlo.

Siempre podrías escribir una cosa un poco menos cochina, usando BETWEEN:

WHERE DATEPART(DayOfYear, Fecha)
BETWEEN DatePart(DayOfYear, @FechaDesde)
AND DATEPART(DayOfYear, @FechaHasta)

Volviendo al supuesto de que lo que te interese sea obtener todos los
registros de operaciones realizadas dentro de una determinada época del año
para todos los años para los que tienes historia, y si la cantidad de
registros que tienes es abrumadora, y si la cantidad de registros que
esperas obtener es relativamente pequeña, podrías optimizar la búsqueda
teniendo una columna indexada, de tipo smallint, donde guardes el día del
año correspondiente a la fecha (para no alterar la aplicación, podrías
agregar un trigger FOR UPDATE, INSERTE para llenarla).


Salud!
Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
21/10/2008 - 09:41 | Informe spam
Hola Leonardo,

On 21 okt, 08:18, "Leonardo Azpurua" <l e o n a r d o [arroba] m v p s
[punto] o r g> wrote:
"Alhambra Eidos Desarrollo"
escribió en el mensajenews: hola a todos,

> tengo este filtro en el where,

> WHERE
> datepart(dayofyear,fecha) >= datepart(dayofyear,@FechaDesde) AND
> datepart(dayofyear,fecha) <= datepart(dayofyear,@FechaHasta)

> Me comentan que el rendimiento puede ser ineficiente, cómo podría hacerlo
> mejor ?

> Me dicen que no cumple con SARG pero qué es SARG ?


Hola,

Coloca un necio en una olla, agrega un sobre de sopa de letras y un litro de
agua, cocina a fuego lento, revolviendo de vez en cuando para que no se
pegue, hasta que comience a hervir y tendrás un analista jefe especialista
en estándares.



:-)



Lo único identificado como SARG que aparece en gugle es "Squid Analysis
Report Generator", un proyecto en SourceForge que parece ser muy importante,
pero no creo que tanto para establecer un estandar con el que haya que
cumplir. Aunque no me hagas mucho caso, que en eso de estándares y
tecnologías de bases de datos soy un perfecto asno.

Si estás usando SARG (sea lo que sea eso) y no sabes qué es, ciertamente
tienes un problema, pero esperemos que ese no sea el caso.



"Search ARGument"


Si lo que quieres es una consulta que te dé todas las operaciones de
determinado tipo realizadas en una época particular del año, para todos los
años para los que tienes información almacenada, tu filtro tiene algún
sentido (aunque los años bisiestos tienen una relacion diferente entre Fecha
y DAYOFYEAR que el resto de los años, a partir del 29 de febrero).

Pero si te interesa obtener todos los registros dentro de un rango de
fechas, bastaría con algo tan simple como WHERE Fecha BETWEEN @FechaDesde
AND @FechaHasta.



Siendo Fecha del tipo Datetime puede tener horas, minutos, etc.
Entonces sería mejor algo como:
WHERE Fecha >= @FechaDesde AND Fecha < @FechaHasta + 1

Y eso suponiendo que @FechaDesde y @FechaHasta solo contienen
una fecha (sin horas y demás).


La ineficiencia resulta del hecho de que no puedes indexar por una función
(coma DATEPART), y si la usas como filtro, es probable que el servidor tenga
que examinar secuencialmente todos los registros de la tabla.



De eso se trata con lo de SARG. Lo que pasa es que a 'alguno' le
gusta mucho jugar a los acertijos y al escondite.

Saludos,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida