【问题标题】:How to use temporal validity in Oracle 12c?如何在 Oracle 12c 中使用时间有效性?
【发布时间】:2013-06-25 00:20:14
【问题描述】:

如何在 Oracle 11g 中设计一个表,以便以后与 Oracle 12c 中的新 “时间有效性” 特性兼容?

Oracle 12c 的在线文档在 SQL 语言指南 (http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_7002.htm#CJADHJHB) 中指定了如何定义时间有效性

ALTER TABLE my_table ADD (PERIOD FOR my_valid_time (my_valid_start, my_valid_end) );

所以人们可以使用 11g 中已有的良好的旧 valid_from 和 valid_till 列,并在 12c 中将它们增强到适当的时期,对吧?

我继承了使用固定魔术日期表示“从始至终”和“永远”的数据库,例如 DATE '1900-01-01'DATE '3999-12-31'。显然,12c 使用了NULL

那么,我们是否必须放弃使用固定的魔术日期并改用NULL 日期?

【问题讨论】:

  • 关于 12c 的好问题!我还没有使用 12c,所以只需添加评论而不是答案。我对 Temporarl Validity 功能的初步解读是,虽然 NULL 更可取,但魔术日期也可以正常工作。它们可能会在一定程度上干扰 Oracle 的 CBO 并导致糟糕的查询计划,但无论如何,魔术值总是如此。并且 12c 的新直方图也可能在某种程度上缓解这种情况。

标签: sql oracle oracle11g oracle12c


【解决方案1】:

是的,您将能够在 12c 中更改表以启用临时有效性(请参阅文档的 ALTER TABLE 部分:http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_3001.htm#CJAEGCFI

它通过将 where 子句转换为“ or is null”子句来工作,因此如果您不想更改固定日期,则无需更改。

Tom Kyte 今天刚刚在他的博客上发布了关于此的内容,并提供了一些出色的示例: http://tkyte.blogspot.com/2013/07/12c-flashforward-flashback-or-see-it-as.html

【讨论】:

  • +1 表示 Tom Kyte 链接,真正出色的解释。当然,您是对的,NULL 1900 都可以,感谢您指出这一点!
  • 有没有办法定义这些时间段的约束以防止重叠范围?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2018-02-01
  • 2015-06-08
  • 2023-03-08
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多