【发布时间】:2017-07-24 09:08:34
【问题描述】:
我经常使用以下 Oracle SQL 查询来查找两个日期之间的最后一个有效更改日期,但效率不高(全表扫描)。 per_all_people_f 的主键是 person_id, effective_start_date, effective_end_date。
基本上对于用户名(不存储有效日期更改),我想找到与该用户一起使用的员工的详细信息。然而,员工更改是有效存储日期,因此我需要在 from 和 to 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 的日期.
【问题讨论】:
-
看不懂,为什么需要
LEFT OUTER JOIN,正常的join应该没问题 -
还有,为什么不能从
papf2获取employee_number,为什么要从papf获取它 -
并非所有用户都分配了员工,因此左外连接。选择employee_number作为例子,一个更好的例子是full_name,当某人结婚时它会改变。
-
左外连接和 from 和 to 参数的效率进一步低下,因为我必须将整个查询包装在子查询中以使 from 和 to 参数工作(不适用于左外连接的可选性)
-
加入
business_group_id,它应该会略微提高性能。
标签: sql oracle indexing oracle-ebs