Oracle 多列索引:判断最近几对(年、学期)

Oracle multi-column index: determine the most recent couple (year, semester)

请假设您在 Oracle table:

中有一个多列索引
CREATE INDEX MY_USER.MY_INDEX ON MY_USER.MY_TABLE
(YEAR, SEMESTER);

YEAR 列是 NUMBER(4)。 SEMESTER 列是 NUMBER(1)。

确定最近一对(年、学期)的最有效方法是什么?

我觉得是这样的:

select max(YEAR) into MY_YEAR from MY_TABLE;

select max(SEMESTER) from MY_TABLE where YEAR = MY_YEAR;

还有其他线索吗?

非常感谢您考虑我的请求。

编辑:table 有超过 5000 万条记录。

第二次编辑:我正在使用这个 Oracle 版本:

BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0  Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.5.0 - Productio
NLSRTL Version 10.2.0.5.0 - Production

问题:确定最近几对(YEAR,SEMESTER)的最有效方法是什么?

如果这是一个不需要优化的一次性查询如何

Select MAX(TO_CHAR(年) || TO_CHAR(学期)) 从 MY_TABLE;

不是一个优雅的解决方案,但它有效。

如果 semester 只能是 12,这可能是有效的:

with t as
   (select max(year), 1 as semester
   from MY_TABLE
   where semester = 1
   union all
   select max(year), 2 as semester
   from MY_TABLE
   where semester = 2)
select MAX(TO_CHAR(YEAR) || TO_CHAR(SEMESTER)) 
from t;

当然,这不是一个通用的解决方案,但它应该适用于您的情况。

更新:

另一个想法是这个:

SELECT year, semester
FROM MY_TABLE
ORDER BY year, semester 
FETCH FIRST 1 ROWS ONLY;

Oracle 12.1 引入了row_limiting_clause

如果我们采用 Kevinsky 的解决方案,并添加一个由两个字段串联而成的字段,结果会怎样。然后我们可以在字段上添加索引?

例如:

alter table MY_TABLE add (concatenated as TO_CHAR(YEAR) || TO_CHAR(SEMESTER))
CREATE INDEX MY_INDEX ON MY_TABLE(concatenated)