为什么 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/
我有一个 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/