SELECT TOP es lento, independientemente de ORDER BY
Tengo una consulta bastante compleja en SQL Server que se ejecuta en una vista, en la forma:
SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]
ORDER BY sortcode;
El plan de consulta como se muestra arriba muestra unSort
operación justo antes de la finalSELECT
, que es lo que esperaría. Solo hay 35 registros coincidentes y la consulta tarda menos de 2 segundos.
Pero si agregoTOP 30
, la consulta lleva casi 3 minutos! UtilizandoSET ROWCOUNT
es igual de lento.
irando el plan de consulta, ahora parece ordenar los más de 2 millones de registros enmyview
antes d las uniones y los filtros.
sta "ordenación" se muestra en el plan de consulta como una exploración de índice en lasortcode
index, una búsqueda de índice agrupado en la tabla principal y un bucle anidado entre ellos, todo antes de las uniones y los filtros.
¿Cómo puedo forzar a SQL Server aSORT
justo ante TOP
, como lo hace cuandoTOP
@ no está especificado?
No creo que la construcción demyview
es el problema, pero por si acaso, es algo como esto:
CREATE VIEW myview AS
SELECT columns..., sortcode, 0 as shared FROM mytable
UNION ALL
SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
El localmytable
tiene unos pocos miles de registros ymytable
en la otra base de datos en la misma instancia de MSSQL tiene algunos millones de registros. Ambas mesasdo tiene índices en sus respectivassortcode
columna.