E assim começa o jogo infeliz de "tentar ser mais esperto que o otimizador (porque nem sempre sabe melhor)".
Você pode tentar colocar as partes de filtragem em uma subconsulta ou CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
O que pode ser suficiente para forçá-lo a filtrar primeiro (mas o otimizador fica "mais inteligente" a cada versão e às vezes pode ver essas travessuras). Ou talvez você precise colocar esse código em um UDF . Se você escrever a UDF como uma função com valor de tabela de várias instruções, com a filtragem dentro, e depois consultar essa UDF com seu
TOP x
/ORDER BY
, você forçou muito bem a ordem de consulta (porque o SQL Server atualmente não consegue otimizar em torno de UDFs de várias instruções). Claro, pensando nisso, introduzir o UDF é apenas uma maneira de esconder o que estamos realmente fazendo - criar uma tabela temporária, usar uma consulta para preenchê-la (com base nos filtros WHERE) e outra consulta para encontrar o
TOP x
da tabela temporária.