Y así comienza el desafortunado juego de "intentar burlar al optimizador (porque no siempre sabe lo que es mejor)".
Puede intentar colocar las partes de filtrado en una subconsulta o CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Lo que puede ser suficiente para forzarlo a filtrar primero (pero el optimizador se vuelve "más inteligente" con cada lanzamiento y, a veces, puede ver a través de tales travesuras). O puede que tenga que ir tan lejos como para poner este código en un UDF . Si escribe la UDF como una función con valores de tabla de varias declaraciones, con el filtrado dentro, y luego consulta esa UDF con su TOP x
/ORDER BY
, ha forzado bastante bien el orden de consulta (porque SQL Server actualmente no puede optimizar las UDF de varias instrucciones).
Por supuesto, pensándolo bien, presentar el UDF es solo una forma de ocultar lo que realmente estamos haciendo:cree una tabla temporal, use una consulta para completarla (según los filtros WHERE), luego otra consulta para encontrar el TOP x
de la tabla temporal.