持久计算的Oracle虚拟列

时间:2014-12-11 09:36:06

标签: sql oracle oracle11gr2

为了获得性能提升,我希望通过组合来自同一列的少数字段来创建持久性派生列。

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

除了一般视图,还可以选择使用Materialized View,它将创建单独的Materialized视图段并单独执行开销。

我试图找出维护只读虚拟列,这将在提交发生时自动插入/更新字段时计算出来。任何人都可以在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;
  5. 在上面的示例中,我希望在执行#1,#2和#4后自动在内部填充field5,而不会增加主要的执行时间。

2 个答案:

答案 0 :(得分:0)

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

 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));

答案 1 :(得分:0)

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

我可以推测,这是为了使用诸如

之类的谓词来优化访问
WHERE field5 like '%#<search key>#%'

避免使用大量 OR s

的复杂谓词

如果这是原因,您可以从附加连接列的附加表中获益

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