Es una selección simple de una tabla temporal, uniendo a la izquierda una tabla existente en su clave primaria, con dos sub-selecciones usando el top 1 que hace referencia a la tabla unida.
En codigo:
SELECT
TempTable.Col1,
TempTable.Col2,
TempTable.Col3,
JoinedTable.Col1,
JoinedTable.Col2,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeColumn = JoinedTable.SomeColumn
) as ThirdTableColumn1,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is also ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeOtherColumn = JoinedTable.SomeColumn
) as ThirdTableColumn2,
FROM
#TempTable as TempTable
LEFT JOIN
JoinedTable
ON (TempTable.PKColumn1 = JoinedTable.PKColumn1 AND
TempTable.PKColumn2 = JoinedTable.PKColumn2)
WHERE
JoinedTable.WhereColumn IN (1, 3)
Esta es una réplica exacta de mi consulta.
Si elimino las dos subelecciones, se ejecuta muy bien y rápidamente. Con las dos sub-selecciones, obtengo alrededor de 100 registros por segundo, lo cual es extremadamente lento para esta consulta porque debería devolver casi un millón de registros.
Verifiqué si cada tabla tiene una Clave primaria, todas las tienen. Todos tienen índices Y estadísticas para sus columnas importantes, como las de las cláusulas WHERE y las de la cláusula JOIN. La única tabla sin clave primaria definida ni índice es la tabla temporal, pero tampoco es el problema porque no está relacionada con las subselecciones lentas y, como mencioné, sin subselecciones, funciona bien.
Sin ellos TOP 1
, devuelve más de un resultado y genera un error.
Ayuda, alguien?
EDITAR :
Entonces el plan de ejecución me dijo que me faltaba un índice. Lo creé y recreé algunos de los otros índices. Después de un tiempo, el plan de ejecución los estaba usando, y la consulta ahora se ejecuta rápidamente. El único problema es que no logro volver a hacerlo en otro servidor, para la misma consulta. Entonces, mi solución será SUGERIR qué índice utilizará SQL Server.