作家
登录

干货|Oracle复杂视图优化案例分析

作者: 来源: 2017-05-09 09:54:06 阅读 我要评论

(2)修改视图定义,将谓词前提写入至基表前提中,并从新编译视图。

在应用Oracle数据库过程中,视图是作为数据库对象存在的,因而,在创建了如许的视图后,就可以经由过程对象或者数据字典来查看视图的相干信息。视图来源竽暌冠表,所有对视图数据的修改最终都邑被反竽暌钩到视图的基表中,这些修改必须服大年夜基表的完全性束缚,并同样会触发定义在基表上的触发器。

Oracle的视图分为简单视图和复杂视凸?现,简单视图就是大年夜单一的表中获取数据,个中不包含函数和数据组等,复杂视图是指在视图定义中包含了聚合函数、分析函数、用户自定义函数、多表接洽关系、子萌芽等。词攀类视图在某些特定前提下,优化器无法将视图外的谓词前提推送至视图内的基表上,即使在基表的列上创建索引也无法应用索引。本文将对该类视图提出一种优化筹划,可以明显进步该类视图的机能,并且表的数据量越大年夜,萌芽数据越少,机能进步越明显。下面,本文在实操基本上,对影响谓词推入身分及若何优化进行扼要阐释。

影响谓词推入身分

本文的实验情况是Oracle 11.2.0.4版本的数据库,笔者经由过程反复测试发明,若萌芽语句中存在以下两种情况,则优化器会阻拦视图谓词前提推入至基表上:一是视图中的萌芽中包含了ROWNUM伪列;二是视图中含有分析函数(如ROW_NUMBER() OVER(…))。若遇其它影响谓词推入的情况优化办法与此办法类似。别的,Oracle 11.2.0.4之前的版本可能存在其它影响谓词推入的情况。

优化办法

如不雅可以将这类视图中常用的谓词前提直接写入视图内,且写成动态的,同时将常用萌芽列按选择性由大年夜至小创建组合索引,则优化器可以尽可能地应用索引直接获取数据,再进行过滤计算等操作,以此达到优化目标。具体操作步调如下:

(1)创建一个帮助包,并创建两个函数,实际情况中若同时传入多个前提可自行扩充包中办法,每一个前提须要增长两个办法。

机能比较

下面经由过程具体的例子来解释若何对复杂视图进行优化。

优化前视图萌芽的履行筹划是全表扫描,履行效力低下。优化后视图萌芽的履行筹划是索引范围扫描。经由过程索引直接掏出须要拜访的数据,再进行后续处理,机能较优化前有大年夜幅晋升。

表4.1 优化前视图定义、萌芽语句及履行筹划

优化前视图定义、萌芽语句及履行筹划

表4.2 优化后视图定义、萌芽语句及履行筹划

优化后视图定义、萌芽语句及履行筹划

经由过程以上分析比较可以清楚地看出,优化后的视图可以应用索引且机能有了明显进步。总结起来,对于复杂萌芽优化思路应当是:如不雅视图中拜访的是少量数据,则尽可能经由过程索引先掏出须要处理的数据,然后再进行后续处理。此办法实用的前提是,复杂视图应用各类惯例优化办法(如增长索引,添加提示符等)都无效时。

经由过程将原视图和优化后视图进行比较,看出优化后视图的履行筹划成本由349降到86,优化效不雅异常明显。表中红框部分内容需特别引起留意。

然则,这一办法也有必定弊病,那就是与其它优化办法比拟,此法须要做的前期工作较多,如建立帮助包,对原视图进行修改和从新编译。别的还需测试优化前后萌芽结不雅是否一致,萌芽前需调用帮助包,将萌芽前提传入视图中,不过优化后的视图是不须要加萌芽前提的。

须要指出的是,该办法只在拜访视图中少量数据时效不雅明显,如不雅拜访数据量大年夜,该办法不实用。

【编辑推荐】

  1. 经由过程Oracle sql developer对象 大年夜sqlserver迁徙数据到oracle
  2. Lotus-Notes数据库向ORACLE数据迁徙
  3. Oracle基于数据发掘的不完全恢复
  4. 针对Oracle数据库备份恢复的一些懂得与总结
  5. Oracle 12.2启用数据库对象的In-Memory转换填充
【义务编辑:枯木 TEL:(010)68476606】

  推荐阅读

  在Linux上给用户赋予指定目录的读写权限

在上篇文┞仿中我们向您展示了如安在 Linux 上创建一个共享目次。此次,我们会为您介绍若何将 Linux 上指定目次的读写权限付与用户。应用用户组来为用户付与指定目次的读写权限有两种办法>>>详细阅读


本文标题:干货|Oracle复杂视图优化案例分析

地址:http://www.17bianji.com/lsqh/35088.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)