Я часто использую следующий запрос Oracle SQL, чтобы найти последнее эффективное изменение даты между двумя датами, но это не очень эффективно (полное сканирование таблицы). Первичный ключ на per_all_people_f
— person_id, effective_start_date, effective_end_date
.
В основном для имени пользователя (которое не сохраняет дату вступления в силу изменений) я хотел бы найти сведения о сотруднике, который работает с этим пользователем. Изменения сотрудников, однако, эффективно хранятся в дате, и поэтому мне нужно найти последнее изменение даты между параметрами from и to date.
Есть ли индекс Oracle, который работает между двумя датами? Есть ли трюк, который я могу использовать, чтобы использовать существующий индекс первичного ключа с датами от и до? Как я могу написать запрос, чтобы быть более эффективным? Почти все запросы, которые я пишу, будут использовать эту логику.
select fu.user_name, papf.employee_number
from fnd_user fu
left outer join
(
select papf2.person_id,
max(papf2.effective_start_date) max_effective_start_date
from per_all_people_f papf2
where papf2.effective_start_date between :P_FROM and :P_TO
group by papf2.person_id
) papf3
on papf3.person_id = fu.employee_id
left outer join per_all_people_f papf
on papf.person_id = fu.employee_id
and papf.effective_start_date = papf3.max_effective_start_date
Если подумать, Oracle, должно быть, тратит много дискового пространства на эти effective_start_date
и effective_end_date
в индексе первичного ключа, поскольку они будут использоваться только в том случае, если вы знаете дату effective_start_date
.
LEFT OUTER JOIN
, нормальное соединение должно быть в порядке - person Sudipta Mondal   schedule 24.07.2017employee_number
изpapf2
, почему вы выбираете его изpapf
- person Sudipta Mondal   schedule 24.07.2017business_group_id
, и это должно незначительно повысить производительность. - person Sudipta Mondal   schedule 24.07.2017