【发布时间】:2021-05-16 13:55:30
【问题描述】:
我有一个表,其中包含一个 TIMESTAMP(6) WITH TIME ZONE 列,以及一个 INTERVAL DAY(4) TO SECOND(0) 列。为了清楚起见,我们假设以下 DDL:
CREATE TABLE TEST_TABLE
(
time_col TIMESTAMP(6) WITH TIME ZONE,
interval_col INTERVAL DAY(4) TO SECOND(0)
);
此表包含使用这两列的索引:
CREATE INDEX IDX_DELAY ON TEST_TABLE(time_col+interval_col);
运行此 DDL 时,Oracle 创建索引但隐式添加 SYS_EXTRACT_UTC 函数:
CREATE INDEX IDX_DELAY ON TEST_TABLE(SYS_EXTRACT_UTC(time_col+interval_col));
过去在其他数据库上运行过相同的 DDL,并且 SYS_EXTRACT_UTC 函数不存在。我不知道数据库是否从旧版 Oracle 迁移而来,但目前它们都在 12c (12.1.0.2.0) 上运行。我在其中一个上删除了索引并重新创建了它,这导致 Oracle 添加了 SYS_EXTRACT_UTC 函数。
为什么会这样?以前的 Oracle DB 版本中的行为是否发生了变化?此外,在索引中包含此功能(或缺少此功能)可能会产生什么影响?
提前致谢!
【问题讨论】:
-
您确定吗,即旧数据库上的数据类型是否相同?我使用
TIMESTAMP WITH TIME ZONE很长时间,索引始终是SYS_EXTRACT_UTC。也许它只是一个隐藏的列,查看ALL_TAB_COLS(不是ALL_TAB_COLUMNS) -
@WernfriedDomscheit 这些列的定义完全相同。我检查了
ALL_TAB_COLS,并且在“旧”数据库中,TIMESTAMP(9) WITH TIME ZONE中隐藏列的DATA_TYPE的DATA_DEFAULT值为"TIME_COL"+"INTERVAL_COL"。但是,在“新”数据库中,DATA_TYPE是TIMESTAMP(9),DATA_DEFAULT是SYS_EXTRACT_UTC("TIME_COL"+"INTERVAL_COL")。
标签: sql oracle indexing oracle12c utc