У меня довольно простая таблица Oracle 9, состоящая из метки времени, номера элемента и значения.
DT_RECORDDATE ITEMID SYSTEMID VALUE
2019-04-04 25 97 1
2019-04-05 19 55 1
2019-04-06 25 44 1
2019-04-03 44 29 2
Первичный ключ - DT_RECORDDATE и ITEMID.
Что я хотел бы сделать, так это получить самое последнее DT_RECORDDATE или, что еще лучше, самое последнее VALUE для каждого из моих идентификаторов предметов.
Для приведенной выше таблицы я должен получить что-то вроде этого ...
DT_RECORDDATE ITEMID
2019-04-05 19
2019-04-06 25
2019-04-03 44
Мое текущее решение состоит в том, чтобы получить самую высокую отметку даты.
SELECT MAX(DT_RECORDDATE), ITEMID
FROM MYTABLE
WHERE DT_RECORDDATE <= to_date('2019-05-05 10:00:00','YYYY-MM-DD hh24:mi:ss')
AND SYSTEMID=1
GROUP BY ITEMID
Однако на больших столах это занимает МНОГО времени.
В результирующем наборе имеется 50 различных идентификаторов (больше, чем в таблице, но они отфильтрованы предложением WHERE).
Помимо создания новых ключей базы данных (что не слишком интересует администратора), есть ли способ улучшить время выполнения этого запроса? Запуск базы данных, содержащей несколько миллионов записей, занимает несколько секунд.
Я знаю, что люди, как правило, используют PARTITION
и RANK()
для улучшения производительности, но я должен признать, что я не очень хорошо знаком с тем, как они работают или будет ли это применимо в этом случае, так как Я не провел много времени с Oracle.
В настоящее время они не могут перейти на более современную версию Oracle Server.