É uma seleção simples de uma tabela temporária, que permanece unida a uma tabela existente em sua chave primária, com duas sub-seleções usando o primeiro 1 referente à tabela unida.
Em código:
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 é uma réplica exata da minha consulta.
Se eu remover as duas sub-seleções, ele funcionará bem e rapidamente. Com as duas sub-seleções, recebo cerca de 100 registros por segundo, o que é extremamente lento para esta consulta porque ela deve retornar quase um milhão de registros.
Eu verifiquei se todas as tabelas possuem uma chave primária, todas elas possuem. Todos eles têm índices E estatísticas para suas colunas importantes, como aquelas nessas cláusulas WHERE e as da cláusula JOIN. A única tabela sem chave primária definida nem índice é a tabela temporária, mas também não é o problema porque não é a que está relacionada às sub-seleções lentas e, como mencionei, sem sub-seleções, ela funciona muito bem.
Sem eles TOP 1
, retorna mais de um resultado e gera um erro.
Ajuda alguém?
EDIT :
Então, o plano de execução me disse que estava faltando um índice. Eu criei e recriei alguns dos outros índices. Depois de um tempo, o plano de execução os estava usando e a consulta agora é rápida. O único problema é que não estou conseguindo fazer isso novamente em outro servidor, para a mesma consulta. Portanto, minha solução será sugerir qual índice o SQL Server usará.