为什么 Oracle 隐式添加 SYS_EXTRACT_UTC 到索引?

Why does Oracle implicitly add SYS_EXTRACT_UTC to index?

我有一个 table,其中包含一个 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)
);

此 table 包含使用这两列的索引:

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 版本中的行为是否有变化?此外,在索引中使用此功能(或缺少此功能)会产生什么影响?

提前致谢!

不管怎样,要创建索引,您必须能够相互比较值(确定它们是否相等,或者确定哪个更大哪个更小)。为了将时间戳与时区进行比较,您必须将它们转换为单个时区; UTC 似乎是一个自然的选择。

我无法判断旧版本中的 Oracle 是否真的在索引中存储了带时区的时间戳,而不是先将它们转换为标准时区;也许确实如此,这就是为什么您在旧版本中看不到 SYS_EXTRACT_UTC 的原因。如果是这样,那么有人有 good 的想法来使用这个函数,并存储 normalized[=32] 是件好事=] 索引中的时间戳。这让一切变得更简单、更高效。

当然,也有可能是 Oracle 一直在这样做,只是最近才决定向我们展示它到底在做什么。

无论如何,我看不出你有任何理由为此担心。有什么顾虑?

EDIT - Google 搜索将我带到 Jonathan Lewis 的这篇文章;他说他从 2013 年开始撰写有关它的文章,也就是 Oracle 12 发布的时候。也许这是一个巧合,或者也许那个版本确实发生了某些变化(索引的实际方式 created/stored,或者 Oracle 选择 向我们展示的).

https://jonathanlewis.wordpress.com/2019/05/29/timestamp-oddity/