Pregunta

¿Cómo puedo obtener una consulta que utiliza un OR en la cláusula WHERE para dividirse en dos consultas con un sindicato durante la compilación? Si vuelvo a escribir manualmente, la consulta utilizando la UNION es 100 veces más rápido que la única consulta, ya que puede utilizar con eficacia los diferentes índices en cada consulta de la unión. ¿Hay alguna manera de hacer que el optimizador de utilizar este enfoque?

Tengo una consulta que es como la siguiente:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

Cuando columnlist, joincond2, joincond3 y condiciones1 son todas expresiones más largas. El truco es que sólo una de las condiciones en el quirófano es siempre verdadero.

Al principio pensé que sólo podía volver a escribir para hacer la unión, pero luego estoy repitiendo columnlist, joincond2, joincond3 y condiciones1, que es más o menos 20 líneas de SQL que podrían necesitar una gran cantidad de mantenimiento en el futuro. ¿Hay un indicio que puede proporcionar o alguna forma mejor escribir la cláusula WHERE? Gracias de antemano.

¿Fue útil?

Solución

Puede agrupar

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

en una visión, y luego utilizar la unión.

pero si se puede migrar a sql2005 / 8, se puede utilizar una expresión de tabla común.

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

Otros consejos

Trate de añadir la opción (RECOMPILE) a la consulta. Si está en un procedimiento almacenado a continuación, añadir CON RECOMPILE a eso también. Puede ser que la primera vez que se ejecuta la consulta de SQL Server se le ocurre un plan y lo almacena en caché pero luego la segunda vez que sigue utilizando el viejo (y ahora pobres) plan de consulta.

Se le toma un golpe de menor importancia, ya que tendrá que volver a compilar cada vez que utilice la consulta, pero va a ser minúscula en comparación con el uso de un plan pobre.

EDIT: He leído que usando CON RECOMPILE en un procedimiento almacenado en SQL 2000 no siempre funciona correctamente. El error se supone fija en SQL 2005. nunca he encontrado el error personalmente embargo, así que no sé lo que el trato es exacta con ella. Darle una oportunidad sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top