SELECT TOP é lento, independentemente de ORDER BY
Tenho uma consulta bastante complexa no SQL Server executando em uma exibição, no formato:
SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]
ORDER BY sortcode;
O plano de consulta, como mostrado acima, mostra umSort
operação imediatamente antes da finalSELECT
, o que eu esperaria. Existem apenas 35 registros correspondentes, e a consulta leva menos de 2 segundo
Mas se eu adicionarTOP 30
, a consulta leva quase 3 minutos! UsandoSET ROWCOUNT
é tão lento.
Observando o plano de consulta, agora parece classificar todos os mais de 2 milhões de registros emmyview
antes junções e filtro
Esta "classificação" é mostrada no plano de consulta como uma Verificação de índice nosortcode
index, uma busca de índice clusterizado na tabela principal e um loop aninhado entre eles, tudo antes das junções e filtro
Como forçar o SQL Server aSORT
antes de TOP
, como acontece quandoTOP
não está especificado?
Eu não acho que a construção demyview
é o problema, mas por precaução, é algo como isto:
CREATE VIEW myview AS
SELECT columns..., sortcode, 0 as shared FROM mytable
UNION ALL
SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
O localmytable
tem alguns milhares de registros emytable
no outro banco de dados na mesma instância do MSSQL possui alguns milhões de registros. Ambas as tabelasdo índices em seus respectivossortcode
column.