¿Por qué la velocidad de una query en SQL Server cambia tanto dependiendo de como se escriba una condición en el WHERE?

publicado por: Anonymous

Tengo cierta vista en sqlserver que almacena datos diarios con un campo fecha incluido (supongamos vista llamada vista_1).
Adicional mente tengo una tabla x que me entrega la fecha para el día de ayer, mediante una query simple (select distinct dia from tabla_x)

El problema es que cuando intento obtener datos de la vista poniendo en la clausula where la query de la fecha, la consulta demora demasiado tiempo. Abajo pongo mas o menos como escribo la consulta

Select * from vista_1 where fecha=(select distinct dia from tabla_x)

Lo raro del tema es que si la fecha la pongo literal, es decir, si la escribo como por ejemplo ‘20170101’ la query no demora nada. abajo el Ejemplo

Select * from vista_1 where fecha='20170101'

¿Qué debo hacer para acelerar mi primera consulta? o para crear un método alternativo para acelerar la query dada. Obviamente asumo que agregar una consulta en la clausula where trae consigo una ineficiencia, pero la diferencia entre ambas opciones es demasiada a mi entender

solución

El problema que estas teniendo viene dado por la forma en que la base resuelve la consulta.

Sin ver el explain plan, que eliminaría la mayor parte de tus dudas, supongo que tu vista, no esta accediendo por ningún indice, o tiene muchos registros, o el distinct le esta costando mucho.

Si tu segunda query es una vista común, entonces el optimizador de consultas puede reescribir la consulta como quiera, haciendo que algo que parezca que va a andar mas rápido, todavía ande mucho mas lento. Ademas las vistas se optimizan para determinados parámetros, y a veces para otros querys esto resulta costoso

No hay una forma canónica de acelerar la consulta. La misma depende de las tablas que estés usando y sus indices.

Si queres mas información, deberías leer el explain plan, y ver que esta haciendo tu base de datos para ejecutar la consulta.

A simple vista, la primera accede a dos tablas, y la segunda solo a una, con lo cual eso ya la haría mas rápida.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *