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



我有一个表,其中包含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版本中有什么变化吗?此外,在索引中包含这个函数(或缺少它)会产生什么影响?

提前感谢!

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

我不知道Oracle在旧版本中是否实际上在索引中存储带有时区的时间戳,而不首先将它们转换为标准时区;也许是这样,这就是为什么在旧版本中看不到SYS_EXTRACT_UTC的原因。如果是这样,有人拥有是件好事。的想法使用这个函数,并存储规范化索引中的时间戳。

当然,也有可能Oracle一直都在这么做,只是最近才决定让给我们看它在做什么

无论如何,我看不出你有什么理由担心这个。问题是什么?

编辑——谷歌搜索让我看到了乔纳森·刘易斯的这篇文章;他说他从2013年开始写这篇文章,也就是Oracle 12发布的时候。也许这是一个巧合,或者在那个版本中确实发生了一些变化(要么是索引创建/存储的实际方式,要么是Oracle选择显示给我们的)。

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

相关内容

  • 没有找到相关文章

最新更新