我经常使用以下 Oracle SQL 查询来查找两个日期之间的最后一个有效更改日期,但效率不高(全表扫描)。上的主键per_all_people_f
是person_id, effective_start_date, effective_end_date
。
基本上对于用户名(不存储有效日期更改),我想找到与该用户一起使用的员工的详细信息。然而,员工更改是有效存储日期,因此我需要找到从和到日期参数之间的最后一个有效更改日期。
是否有适用于两个日期之间的 Oracle 索引?有没有一个技巧可以用来将现有的主键索引与 from 和 to 日期一起使用?如何编写查询以提高效率?我写的几乎所有查询都会使用这个逻辑。
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
.