为了获得性能提升,我希望通过组合来自同一列的少数字段来创建持久性派生列。
我已经探讨了自动和虚拟列,但没有给我正确的解决方案。 发现Oracle Virtual列类似于派生列,在一般视图中具有一些附加功能的字段组合/计算,它在查询执行期间执行虚拟列表达式。
除了一般视图,还可以选择使用Materialized View,它将创建单独的Materialized视图段并单独执行开销。
我试图找出维护只读虚拟列,这将在提交发生时自动插入/更新字段时计算出来。任何人都可以在Oracle 11gR2中为此解决方案提供帮助吗?
- 示例:
create table table1(id int, field1 varchar2(30),field2 varchar2(30),field3 varchar2(30),field4 varchar2(30),field5 varchar2(200));
update table1 set field5=field1 || '#' || field2 || '#' || field3 || '#' || field4;
commit;
在上面的示例中,我希望在执行#1,#2和#4后自动在内部填充field5,而不会增加主要的执行时间。
答案 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