我在甲骨文数据库里有一个很大的表。
该表有一个timestamp列,它是表的parition键,这意味着在过去x天(例如)中查找结果时,对该列进行筛选的速度最快。比如: SELECT * FROM some_table WHERE time > sysdate - 1
现在,我要查找的是插入了最新时间戳列(最新)的行。重要的是,它可能不止一行,所以按行数限制可能不起作用。
我所做的和成功的是:
SELECT product, time
from some_table
where time in (
SELECT max(time) from some_table
)
它是有效的,但据我所知(如果我错了,请纠正我),它的效率非常低(在大表上仍然需要时间),因为db仍然遍历所有行以查找最大时间戳,然后在外部选择中,它将再次在所有行上查找匹配的时间戳。
因为这个表是按时间戳排序的,所以我想做一个高效的查询,当它遇到最新的timestmap中的较旧的timestmap时,它会停止搜索,而最新的timestmap也是他看到的第一个timestmap。
例如:
Product, time
Blowdry, 2020-05-22 09:00:30
Book, 2020-05-22 09:00:30
Phone, 2020-05-22 09:00:30
PC, 2020-05-22 08:30:15 -- Here I want the db to stop and show only the 3 rows above
... (Many rows)
谢谢
1条答案
按热度按时间rhfm7lfc1#
你的问题很好。但是,您应该使用
=
而不是in
:事实上,这可以是相当快的索引上
time
. 子查询将使用索引来获取最长时间。然后,外部查询将使用索引来获取匹配的行。在oracle 12c中,您还可以使用:
这也应该在上使用索引
time
.