sql—当表按时间戳列进行分区时,如何仅从最新的时间戳中选择行?

i2loujxw  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(343)

我在甲骨文数据库里有一个很大的表。
该表有一个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)

谢谢

rhfm7lfc

rhfm7lfc1#

你的问题很好。但是,您应该使用 = 而不是 in :

select product, time
from some_table
where time = (select max(t2.time) from some_table t2);

事实上,这可以是相当快的索引上 time . 子查询将使用索引来获取最长时间。然后,外部查询将使用索引来获取匹配的行。
在oracle 12c中,您还可以使用:

select product, time
from some_table
order by time desc
fetch first 1 row only with ties;

这也应该在上使用索引 time .

相关问题