/ / Optimize Query (remove subquery) - sql, sql-server

Otimizar consulta (remover subconsulta) - sql, sql-server

Você pode me ajudar a otimizar esta consulta? Eu preciso remover a subconsulta porque o desempenho é horrível.

select LICENSE,
(select top 1 SERVICE_KEY
from SERVICES
where SERVICES.LICENSE = VEHICLE.LICENSE
order by DATE desc, HOUR desc)
from VEHICLE

O problema é que eu posso ter dois SERVIÇOS na mesma DATA e HORA, então eu não consegui codificar um SQL equivalente evitando a subconsulta.

A consulta é executada em um banco de dados Legacy no qual não posso modificar seus metadados e ele não possui nenhum índice. Essa é a razão para procurar uma solução que possa evitar uma consulta correlacionada.

Obrigado.

Respostas:

4 para resposta № 1

Você pode expressar sua consulta usando ROW_NUMBER() sem a necessidade de uma subconsulta correlacionada. Tente a seguinte consulta e veja como a performance é:

SELECT t.LICENSE, t.SERVICE_KEY
FROM
(
SELECT t1.LICENSE, t1.SERVICE_KEY
ROW_NUMBER() OVER (PARTITION BY t1.LICENSE
ORDER BY t2.DATE DESC, t2.HOUR DESC) rn
FROM VEHICLE t1
INNER JOIN SERVICES t2
ON t1.LICENSE = t2.LICENSE
) t
WHERE t.rn = 1

O desempenho dessa consulta dependeria, entre outras coisas, de ter índices nas colunas de junção de suas duas tabelas.