【问题标题】:Persistent computed Oracle Virtual Column持久计算的 Oracle 虚拟列
【发布时间】:2014-12-11 09:36:06
【问题描述】:

为了提高性能,我希望通过组合同一列中的几个字段来制作持久性派生列。

我已经探索了自动化和虚拟列,但没有给我合适的解决方案。 发现Oracle虚拟列类似于派生列,在一般视图中具有字段的组合/计算,并具有一些附加功能,它在查询执行期间执行虚拟列表达式。

除了一般视图,还有使用物化视图的选项,这将创建单独的物化视图段和单独的执行开销。

我试图找出维护只读虚拟列,当提交发生时,它将在插入/更新字段时自动计算。任何人都可以在 Oracle 11gR2 中为这个解决方案提供帮助吗?

--例子:

  1. create table table1(id int, field1 varchar2(30),field2 varchar2(30),field3 varchar2(30),field4 varchar2(30),field5 varchar2(200));
  2. ....直接路径加载将通过 ETL 过程发生在 id、field1、field2、field3 和 field4 中...
  3. update table1 set field5=field1 || '#' || field2 || '#' || field3 || '#' || field4;
  4. commit;

在上面的示例中,我希望在执行 #1、#2 和 #4 后在内部自动填充 field5,而不增加主要执行时间。

【问题讨论】:

  • 对于这么简单的表达式,我看不出实际存储这个值有什么好处。只需使用虚拟/计算列就可以了。
  • 您是否实际测试过性能影响?它认为你不会注意到它。
  • 当您在第 2 步中填充了大量数据时,上述更新语句需要更长的时间。我只是希望避免在这里执行更新。
  • 再次:为什么您认为您需要一个 persisted 列?如果您只是创建一个常规计算列,您 确实 避免执行更新。使用计算列检索时是否遇到性能问题?
  • 原因: 1、以下SQL脚本需要引用拼接字段。 2. 避免更新执行 3. 绕过日志记录

标签: sql oracle oracle11gr2


【解决方案1】:

请仔细检查为什么您需要额外的列。

我可以推测,这是为了使用谓词优化访问,例如

WHERE field5 like '%#<search key>#%'

为了避免复杂的谓词有很多 ORs

如果是这个原因,您可能会受益于 附加表 插入附加连接列

create table HLPR
(id number,  /* FK to your table */
 field_no NUMBER,
 field_value  varchar2(30));

你现在可以用与上面相同的谓词来制定

 WHERE field_value = '<search key>'

即您可以通过 FULL TABLE SCAN 或索引访问来获得高性能查询。

对不起,如果我的猜测方向错误,只有我的 0.02c

【讨论】:

    【解决方案2】:

    我们可以使用下面的查询来解决上述问题

     create table table1
     (id int, 
      field1 varchar2(30),
      field2 varchar2(30),
      field3 varchar2(30),
      field4 varchar2(30),
      field5 varchar2(200) GENERATED ALWAYS AS (field1 || '#' || field2 || '#' || field3 || '#' || field4));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2010-12-16
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多