我想获取具有最小值为 myDate 列的行。为此,我使用以下查询:
select * from (select * from table where processed = 'N'
order by myDate)
where rownum = 1;
是否可以创建一个索引,使该查询在 Oracle 中具有 O(1) 时间复杂度:只需从具有最小日期的未处理行中选择第一行(类似于 btree 索引分为两部分作为processed
列可能只有值“Y”或“N”)。
我想获取具有最小值为 myDate 列的行。为此,我使用以下查询:
select * from (select * from table where processed = 'N'
order by myDate)
where rownum = 1;
是否可以创建一个索引,使该查询在 Oracle 中具有 O(1) 时间复杂度:只需从具有最小日期的未处理行中选择第一行(类似于 btree 索引分为两部分作为processed
列可能只有值“Y”或“N”)。
是的,使用 (myDate, processes) 上的索引,您将能够直接检索一行。不是 O(1)(btree 不提供),但比全表扫描的 O(n) 好得多。
该索引中的列顺序很重要。您通常希望它首先按 myDate 排序,然后在该开关中按该标志(但见下文)。
另请注意,如果“第一个”(按 myDate 排序)数千个条目都具有processed=Y
索引扫描,则仍然需要(一点)时间来跳过所有这些(在索引中,而不是进入表中)。如果这适用于所有条目,最坏的情况仍然是 O(n) (然后它将是全索引扫描)。
如果这是一个问题,您可以将索引列顺序切换为(已处理,myDate)。然后,您将有效地拥有两个 B 树索引,一个用于 Y,一个用于 N。