没有有关数据和表的更多信息,这个问题很难回答。当您在评论中说您拥有所需的所有索引时,这些索引是什么?
另外,时间段是否邻接且不重叠?您能获取最近的START_DATE期间吗?
查看END_DATE的问题是普通的B树索引不能索引NULL。因此,该形式的谓词
where end_date isnulll不太可能使用索引。您可以在列中使用位图索引,因为那些索引类型会将索引设为空,但是由于位图索引的其他一些缺点,这可能并不理想。
由于上述原因,我可能会使用与以下查询类似的查询:
select user, plan, start_date, end_datefrom ( select user, plan, start_date, end_date, row_number() over (partition by user order start_date desc) as row_num_1, row_number() over (partition by user order end_date desc nulls first) as row_num_2 from user_table where user = :userid)where row_num_1 = 1
您可以根据实际需求在此处使用
row_num_1或
row_num_2列。
或者
select user, plan, start_date, end_datefrom ( select user, plan, start_date, end_date, from user_table where user = :userid order by start_date desc)where rownum = 1
无论您是试图让所有用户返回还是仅返回一个用户,第一个查询都应该起作用。第二个查询仅适用于一个用户。
如果您可以使用架构的更多详细信息(索引,开始/结束日期的含义)来补充问题,则可能会得到更好的答案。



