У меня была проблема с производительностью в моем запросе, я нашел решение, но я не очень понимаю, почему у меня возникла проблема, поэтому кто-то может мне это объяснить ... У меня есть 2 таблицы: Поток (несколько строк по миллионам) и Устройства (<10 строк). Ожидаемый результат запроса: последняя строка из таблицы потоков для каждого устройства, а также данные из таблицы устройств. </p>
Мой первый запрос:
SELECT * FROM Flow WHERE FlowId IN (SELECT MAX(FlowId) FROM Flow GROUP BY DeviceId)
Время выполнения> 200 секунд.
Если я сначала выполню подзапрос (получаю результат за 0,01 секунды), а затем использую результат в запросе:
SELECT * FROM Flow WHERE FlowId IN (93143922, 93143921)
У меня результат меньше, чем за секунду ... Как СУБД выполняет первый запрос ? Я думал, что поток: сначала выполнить подзапрос, а затем использовать результат в «основном» запросе? Если я делаю эти шаги вручную, запрос выполняется быстро, так что это абсолютно не так: (
Мое решение таково:
SELECT * FROM Flow f
INNER JOIN Devices d on d.DevicesId = f.DeviceId
INNER JOIN (SELECT MAX(FlowId) as FlowId FROM FLOW GROUP BY DeviceId) maxFlow
ON maxFlow.FlowId = f.FlowId
Но мне нужно знать, как он работает с IN:)