如果没有有关数据和表格的进一步信息,这个问题有点难以回答。当您在评论中说您拥有所需的所有索引时,这些索引是什么?
另外,时间段是否相邻且不重叠?您能否获取最新 START_DATE 的时间段?
查看 END_DATE 的问题是普通的 B 树索引不会索引 NULL。因此,形式的谓词where end_date is nulll
不太可能使用索引。您可以对列使用位图索引,因为这些类型的索引会对空值进行索引,但这可能并不理想,因为位图索引还有一些其他缺点。
由于上述原因,我可能会使用类似于以下查询的查询:
select user, plan, start_date, end_date
from (
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
or the row_num_2
根据具体要求在此处列。
OR
select user, plan, start_date, end_date
from (
select
user,
plan,
start_date,
end_date,
from user_table
where user = :userid
order by start_date desc
)
where rownum = 1
无论您是尝试恢复所有用户还是仅恢复一个用户,第一个查询都应该有效。第二个查询仅适用于一个用户。
如果您可以使用架构的更多详细信息(索引、开始/结束日期的含义)来补充问题,您可能会得到更好的答案。