Мне нужно найти последнее местоположение каждой позиции груза в партии. Мы в основном делаем это, просматривая маршрут, выбранный для груза, а затем определяя самое позднее (максимальное) время
вступил против узлов этого маршрута. Например, если у маршрута есть 5 узлов, и мы ввели временные параметры для первых 3 узлов, то самое позднее время (максимальное время) сообщит нам о его местонахождении среди 3 узлов.
Я действительно застрял в этом вопросе относительно проблем с производительностью. Даже на нескольких сотнях рядов это занимает более 2 минут. Пожалуйста, предложите, как я могу улучшить этот запрос или какой-либо альтернативный подход, который я должен приобрести?
Примечание: ATA = фактическое время прибытия и ATD = фактическое время вылета
SELECT DISTINCT
c.id as cid
, c.ref as cons_ref
, c.Name
, c.CustRef
FROM consignments c
INNER JOIN routes r ON c.Route = r.ID
INNER JOIN routes_nodes rn ON rn.Route = r.ID
INNER JOIN cargo_timing ct ON c.ID=ct.ConsignmentID
INNER JOIN ( SELECT t.ConsignmentID, Max(t.firstata) as MaxDate
FROM cargo_timing t
GROUP BY t.ConsignmentID
) as TMax
ON ( TMax.MaxDate=ct.firstata
AND TMax.ConsignmentID=c.ID
)
INNER JOIN nodes an ON ct.routenodeid = an.ID
INNER JOIN contract cor ON cor.ID = c.Contract
WHERE c.Type = 'Road'
AND ( c.ATD = 0 AND c.ATA != 0 )
AND (cor.contract_reference in ('Generic','BP001','020-543-912'))
ORDER BY c.ref ASC