PLSQL_性能优化系列10_Oracle Array数据组优化

 2014-09-25 Created By BaoXinjian

一、摘要


集合是Oracle开发中经常遇到的情况,Oracle集合分为三种情况:索引表集合(index by table)、嵌套表集合(nested table)、可变集合(varry table)。

PL/SQL中没有数组的概念,他的集合数据类型和数组是相似的。

  • 其中varray table的元素是有数量限制的,index_by table和nexted table是没有这个限制的。
  • index-by table是稀疏的,也就是说下标可以不连续,varray table则是紧密的,他的下标没有间隔。
  • index_by table不能存储在数据库中,但是nexted table和varray table可以被存储在数据库中。

集合在使用时必须先使用type进行定义方可使用

 

二、集合的定义方式


1. 索引表集合 index by table

TYPE test_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;

遍历方式:这种数组不需要事先指定上限,下标可以不连续,可以是0或负数。

数据库存放:不可以存放在数据库中

2. 嵌套表集合 nested table

TYPE test_type IS TABLE OF VARCHAR2(10);

遍历方式:下标从1开始,不能超过数组所有元素的总和,当下标超出允许范围时

数据库存放:可以存放在数据库中

3. 可变集合 varry table

TYPE test_type IS ARRARY(5) OF VARCHAR2(10);

遍历方式:由于类型定义时的元素个数限制,所以TYPE3的变量在使用时最大的元素个数不能超过5个。

数据库存放:可以存放在数据库中

 

三、数组的存放在数据库方式


案例: 创建一个存在嵌套表集合类型栏位的表

Step1. 创建记录类型Record Type

CREATE OR REPLACE TYPE bxj_record
ASOBJECT (bxj_record_id NUMBER,bxj_record_date DATE,bxj_record_description VARCHAR2 (10));

Step2. 创建嵌套表集合类型nested table type

CREATE OR REPLACE TYPE bxj_nested_table AS TABLE OF bxj_record;

Step3. 创建测试表,用以存放集合

CREATE TABLE bxj_test_table
(invoice_id       NUMBER,invoice_num      VARCHAR2 (10),invoice_date     DATE,invoice_nested   bxj_nested_table
)
NESTED TABLE invoice_nested STORE AS bxj_record_table

Step4. 查看所建立的Object

Step5. 插入测试资料

DECLAREv_record1          bxj_record := bxj_record (1, SYSDATE, '2014/09/29');v_record2          bxj_record := bxj_record (2, SYSDATE, '2014/09/30');v_invoice_id       NUMBER;v_invoice_num      VARCHAR2 (10);v_invoice_date     DATE;v_invoice_nested   bxj_nested_table := bxj_nested_table ();
BEGINv_invoice_id := 1;v_invoice_num := 'INVOICE_01';v_invoice_date := SYSDATE;v_invoice_nested.EXTEND;v_invoice_nested (1) := v_record1;v_invoice_nested.EXTEND;v_invoice_nested (2) := v_record2;INSERT INTO bxj_test_tableVALUES   (v_invoice_id,v_invoice_num,v_invoice_date,v_invoice_nested);COMMIT;
END;

Step6. 查看表数据

 

四、数组优化方式 (arraysize / bulk collect)


客户端Arraysize的设置实际上可以理解为设置数组的大小来保存sql调用的返回值。设置适当的arraysize有几个好处:

1.减少读data block的次数,也就是consistent gets的次数。

假设一个block有n行,如果每次取一行,则对该block的逻辑读次数就是n,尽管逻辑读是内存读,速度很快,但并发量很大时也会使数据库的压力很大。

如果每次取>n行,则该block只需读一次。因此合理设置arraysize能大大减轻数据库压力。

2.在PLSQL中减少plsql引擎和sql引擎的切换次数,提高效率

3.通过数组存放结果,减少客户端和数据库服务器的调用次数,减少往返时间

 

五、PLSQL Bulk Collect设置数组访问的方法


案例:测试Bulk Collect访问数组的限制对consistent gets和script run time的影响

测试一:不使用bulk collect,一次fetch一条记录

Step2. 运行测试脚本

DECLARECURSOR c1ISSELECT   object_nameFROM   all_objectsWHERE   ROWNUM < 100000;v_id   VARCHAR2 (30);
BEGINOPEN c1;LOOPFETCH c1 INTO   v_id;EXIT WHEN c1%NOTFOUND;NULL;END LOOP;CLOSE c1;
END;
/

Step3. 查看运行后consisten gets变化 = 235622 -109441 = 126811

 

测试二:设置bulk collect,一次取100条

Step1. 运行测试脚本

DECLARETYPE VarcharTabISTABLE OF VARCHAR2 (30)INDEX BY BINARY_INTEGER;CURSOR c1ISSELECT   object_nameFROM   all_objectsWHERE   ROWNUM < 100000;v_id   VarcharTab;
BEGINOPEN c1;LOOPFETCH c1 BULK COLLECT INTO   v_id LIMIT 100;EXIT WHEN c1%NOTFOUND;NULL;END LOOP;CLOSE c1;
END;
/

Step2. 查看运行后consisten gets变化 = 284623 -235622= 49001


 

测试三:设置bulk collect,一次取5000条

Step1. 运行测试脚本

DECLARETYPE VarcharTabISTABLE OF VARCHAR2 (30)INDEX BY BINARY_INTEGER;CURSOR c1ISSELECT   object_nameFROM   all_objectsWHERE   ROWNUM < 100000;v_id   VarcharTab;
BEGINOPEN c1;LOOPFETCH c1 BULK COLLECT INTO   v_id LIMIT 5000;EXIT WHEN c1%NOTFOUND;NULL;END LOOP;CLOSE c1;
END;
/

Step2. 查看运行后consisten gets变化 = 332559 -284623= 47936

 

测试结果

  • 测试一:consisten gets变化 = 235622 -109441= 126811
  • 测试二:consisten gets变化 = 284623 -235622= 49001
  • 测试三:consisten gets变化 = 332559 -284623= 47936

consistent_gets是从回滚段中读到的前映(或叫读取一致性影象), 看见的数据是查询开始的时间点的,所以若存在block在查询开始后发生了变化的情况,则必须产生 before image 然后读数据,这就是一致读的含义

查询就是表示 consistent gets (query mode),因为查询要保证所获取的数据的时间点的一致性,所以叫一致读,

即使是从当前 buffer 获得的数据,也叫 consistent gets ,这仅仅表达一种模式一种期望,并不表示真实的是从 当前buffer 获得 还是从回滚段获取数据产生的 bufore image 。

 

网络上的一个测试结果

 

六、SQLPLUS设置数组访问的方法


Sqlplus的arraysize参数表示数据库一次返回给客户端的行数,缺省是15。

如果返回数据量大,可以调大此参数:Set arraysize nnnn, 该参数最大为5000。

 

测试一:缺省arraysize  

select * from all_objects where rownum <100000;

查看执行时间

 

测试二:SQL> set arraysize 1000  

select * from all_objects where rownum <100000;

查看执行时间

 

Thanks and Regards

参考:http://www.jb51.net/article/35424.htm


转载于:https://www.cnblogs.com/eastsea/p/3981038.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 2020.2 重磅发布,动画级新功能预览!

Guide 关注了 IDEA 的官推&#xff0c;平时没事就会去看看有没有啥比较好的更新。今天下午看到IntelliJ IDEA 2020.2 都已经发布并且还支持了 Java15。然后&#xff0c;我就去官网简单看了一下新特性。单看新特性&#xff0c;这个新版本还是有一点香的。虽然我还木有升级到这个…

访问控制模型ACL和RBAC

2019独角兽企业重金招聘Python工程师标准>>> 1.ACL ACL是最早也是最基本的一种访问控制机制&#xff0c;它的原理非常简单&#xff1a;每一项资源&#xff0c;都配有一个列表&#xff0c;这个列表记录的就是哪些用户可以对这项资源执行CRUD中的那些操作。当系统试图…

最常见并发面试题整理!(速度收藏)

前言并发编程是面试中必问的知识点之一&#xff0c;所以本文整理了一些最为常见的并发面试题&#xff0c;一起来看吧~1. synchronized的实现原理以及锁优化&#xff1f;synchronized的实现原理synchronized作用于「方法」或者「代码块」&#xff0c;保证被修饰的代码在同一时间…

JavaScript中的嵌套事件处理(在鼠标移动事件上)

Multiple event handling is the secret ingredient of dynamic WebPages seen now-a-days. 多重事件处理是当今动态网页的秘密组成部分。 Now, let’s get started... 现在&#xff0c;让我们开始吧... Example Code 范例程式码 <html lang"en"><head&…

皮尔逊相关性_皮尔逊的相关性及其在机器学习中的意义

皮尔逊相关性Today we would be using a statistical concept i.e. Pearsons correlation to help us understand the relationships between the feature values (independent values) and the target value (dependent value or the value to be predicted ) which will furt…

磊哥最近面试了好多人,聊聊我的感受!(附面试知识点)

这是我的第 84 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;一些读者可能知道&#xff0c;磊哥前段时间又回来上班了&#xff0c;详见《磊哥又滚回职场了...》…

M4 宏处理器

2019独角兽企业重金招聘Python工程师标准>>> M4 宏处理器 Brian W. KernighanDennis M. Ritchie Bell LaboratoriesMurray Hill, New Jersey 07974 翻译&#xff1a;寒蝉退士 译者声明&#xff1a;译者对译文不做任何担保&#xff0c;译者对译文不拥有任何权利并且不…

绝了,几款主流的 JSON 库性能对比!

本篇通过JMH&#xff08;Oracle官方测试框架&#xff09;来测试一下Java中几种常见的JSON解析库的性能。每次都在网上看到别人说什么某某库性能是如何如何的好&#xff0c;碾压其他的库。但是百闻不如一见&#xff0c;只有自己亲手测试过的才是最值得相信的。JSON不管是在Web开…

DWZ使用笔记

DWZ使用笔记 一、前言 在近期的一个项目中&#xff0c;引入了DWZ这个富client框架&#xff0c;算是一次尝试吧。期间也遇到不少问题&#xff0c;总算一一攻克了。特以此文记之。本人用的是dwz-ria-1.4.5Asp.net webform&#xff0c;写这篇笔记时最新版本号已经是1.4.6了。DWZ官…

阿里的简历多久可以投递一次?次数多了有没有影响?可以同时进行吗?

最近&#xff0c;无论是读者群&#xff0c;还是公众号后台&#xff0c;很多人都比较关注以下几个问题&#xff1a;阿里的简历是半年只能投递一次吗&#xff1f;阿里的面试可以多个部门同时进行吗&#xff1f;面试没过&#xff0c;又被系统捞起来了&#xff0c;我该怎么办&#…

记一次蚂蚁金服面试被虐经历

本文来自作者投稿&#xff0c;原作者&#xff1a;yes面试前的小姐姐来说说前不久蚂蚁金服一面的情况。说来也是巧合&#xff0c;当时在群里有位蚂蚁金服的小姐姐发了个内推&#xff0c;看了下JD感觉可以试试于是就私聊了小姐姐发简历内推了。我16年也就是大三上就开始实习了&am…

用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧

2019独角兽企业重金招聘Python工程师标准>>> 寻觅工具 确定任务之后第一步就是找个趁手的库来干活。 Python Excel上列出了xlrd、xlwt、xlutils这几个包&#xff0c;但是 它们都比较老&#xff0c;xlwt甚至不支持07版以后的excel它们的文档不太友好&#xff0c;都可…

Spring Boot 2.3.3 正式发布!

Spring Boot 2.3.3 稳定版已发布&#xff0c;可从 repo.spring.io 和 Maven Central 获取。<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.3.RELEASE</versio…

木板最优切割利润最大_最多进行K笔交易的股票最大买卖利润

木板最优切割利润最大This is a very popular interview problem to find maximum profit in stock buying and selling with at most K transactions. This problem has been featured in the interview rounds of Amazon. 这是一个非常受欢迎的面试问题&#xff0c;目的是在最…

[数据库]Oracle和mysql中的分页总结

Mysql中的分页物理分页•在sql查询时&#xff0c;从数据库只检索分页需要的数据•通常不同的数据库有着不同的物理分页语句•mysql物理分页&#xff0c;采用limit关键字•例如&#xff1a;检索11-20条 select * from user limit 10,10 ;* 每次只查询10条记录.当点击下一页的时候…

List 集合去重的 3 种方法

问题由来在实际开发的时候&#xff0c;我们经常会碰到这么一个困难&#xff1a;一个集合容器里面有很多重复的对象&#xff0c;里面的对象没有主键&#xff0c;但是根据业务的需求&#xff0c;实际上我们需要根据条件筛选出没有重复的对象。比较暴力的方法&#xff0c;就是根据…

C语言入门——排序

排序的方法有很多种比较常见的便为&#xff1a;冒泡排序、选择排序、插入排序、快速排序。 今天我们就围绕着四种排序来说&#xff0c;如果有兴趣的话可以去查找一下其他排序。 在排序这方面我们主要讨论&#xff1a; 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&…

【转】eclipse技巧1

2019独角兽企业重金招聘Python工程师标准>>> 俗话说的好啊&#xff0c;“工于利启事&#xff0c;必先善其器”&#xff0c;如果说你的编程功底是一个枪法的话&#xff0c;那么强大的eclipse就是android战士们最好的武器。 这里&#xff0c;我们来总结eclipse的使用技…

定时任务最简单的3种实现方法(超好用)

这是我的第 86 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;定时任务在实际的开发中特别常见&#xff0c;比如电商平台 30 分钟后自动取消未支付的订单&#x…

C语言入门基础——Brute-Force算法

Brute-Force算法的基本思想是&#xff1a; 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较&#xff0c;若相等&#xff0c;则继续逐个比较后续字符&#xff0c;否则从串s 的第二个字符起再重新和串t进行比较。 2) 依此类推&#xff0c;直至串t 中的每个字符依次和…