Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SELECT TOP é lento, independente de ORDER BY


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.