首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >持久计算Oracle虚拟列

持久计算Oracle虚拟列
EN

Stack Overflow用户
提问于 2014-12-11 09:36:06
回答 2查看 1.3K关注 0票数 0

为了提高性能,我希望将来自同一列的几个字段组合成持久性派生列。

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

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

我正在设法维护只读虚拟列,当提交发生时,该列将在插入/更新字段时自动计算。在Oracle11gR2中,有人能帮助这个解决方案吗?

-例如:

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-06 07:11:21

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

代码语言:javascript
运行
复制
 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
EN

Stack Overflow用户

发布于 2015-10-06 07:30:48

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

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

代码语言:javascript
运行
复制
WHERE field5 like '%#<search key>#%'

避免使用大量的复杂谓词

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

代码语言:javascript
运行
复制
create table HLPR
(id number,  /* FK to your table */
 field_no NUMBER,
 field_value  varchar2(30));

与上面的谓词相同,您现在可以用

代码语言:javascript
运行
复制
 WHERE field_value = '<search key>'

也就是说,您可以通过全表扫描或索引访问来获得性能查询。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27419515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档