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
只能是 1
或 2
,这可能是有效的:
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)
请假设您在 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
只能是 1
或 2
,这可能是有效的:
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)