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

PLSQL_性能优化系列10_Oracle Array数据组优化相关推荐

  1. MySQL优化系列(二)--查找优化(1)(非索引设计)

    MySQL优化系列(二)--查找优化(1)(非索引设计) 接下来这篇是查询优化,用户80%的操作基本都在查询,我们有什么理由不去优化他呢??所以这篇博客将会讲解大量的查询优化(索引以及库表结构优化等高 ...

  2. 【MySQL性能优化系列】百万数据limit分页优化

    背景 众所周知,在使用limit分页过程中,随着前端传过来的PageSize越来越大,查询速度会越来越慢.那有什么优化的办法呢? 本文将通过百万数据表进行演示和优化, 欲知详情,请看下文分解. lim ...

  3. rdd数据存内存 数据量_Spark 性能优化(二)——数据倾斜优化

    1.2 数据倾斜优化 1.2.1 为何要处理数据倾斜(Data Skew) 什么是数据倾斜?对 Spark/Hadoop 这样的大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜. 何谓数据倾斜?数据 ...

  4. SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度...

      2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...

  5. 史上最详细的网站优化系列(一)mysql优化1

    一.mysql优化概述 方针: ① 存储层:数据表"存储引擎"选取.字段类型选取.逆范式(3范式) ② 设计层:索引.分区/分表.存储过程,sql语句的优化 ③ 架构层:分布式部署 ...

  6. 【优化系列】MIPS架构汇编优化资料

    DATE: 2021.8.3 文章目录 前言 1.MIPS介绍 2.MIPS汇编入门基础 3.MIPS汇编优化手册 3.1.中文手册 3.2.英文手册 3.3.Loongson 3A 优化 前言 在学 ...

  7. Android性能优化系列:启动优化

    文章目录 1 应用启动类型 1.1 冷启动 1.2 温启动 1.3 热启动 2 查看启动耗时 2.1 adb命令查看 2.2 Logcat Displayed查看启动耗时 2.3 手动记录启动耗时 2 ...

  8. Android App性能优化系列

    Android App性能优化系列 关于Android App的优化,从第一篇的计划开始,到内存优化的系列文结束,不知不觉近三个月的时间,写了十五六篇相关的博文,算是对自己的知识的一个系统化,也希望能 ...

  9. 百度App网络深度优化系列(一):DNS优化

    一.前言 网络优化是客户端几大技术方向中公认的一个深度领域,所以百度App给大家带来网络深度优化系列文章,其中包含系列<一>DNS优化,系列<二>连接优化,系列<三> ...

最新文章

  1. 在 Docker 中运行 MySQL:多主机网络下 Docker Swarm 模式的容器管理
  2. 深入浅出任务队列机制,非常浅
  3. AD5933阻抗转换器、网络分析仪初步实验
  4. Android RemoteController使用
  5. sfp光模块和sfp+高速线缆有什么区别?
  6. css3怎么排除第一个,css怎么排除第一个子元素
  7. 强上阿里云之安装MYSQL
  8. QQ帐号注销功能灰度体验中:预计下周发布!
  9. java中的char类型所占空间
  10. C++函数参数的规则
  11. 阿里移动推送服务端API
  12. 夜晚较为活跃之物种对照图
  13. 力扣题目系列:474. 一和零
  14. linux android交叉编译,【转】搭建arm-linux-gcc交叉编译工具链环境(Android原生(JNI)开发环境搭建)...
  15. 计算机与生物的关系论文题目,生物论文
  16. 微型计算机原理与接口技术第五版pdf,微型计算机原理与接口技术(第5版)
  17. uni-app地址四级联动
  18. Keil4 keil5兼容
  19. 视觉的力量,如何利用视频和社交媒体讲述品牌故事
  20. mysql mgr recovering_mysql group replication recovering 怎么调整为 online

热门文章

  1. oracle rollup分组没有数据时为0_数据库周刊19│GBASE适配鲲鹏;MySQL窗口函数;OGG双向数据同步……...
  2. 已达成计算机的连接数最大值无法再,已达到计算机的连接数最大值,无法再同此远程计算机连接...
  3. java入职华为,通过这9个Java面试题,就可以入职华为啦
  4. oracle00333,Oracle数据库REDO损坏ora-00333修复手札
  5. python 爬取贝壳网小区名称_如何使用 python 爬取全国小区名称
  6. php 复选框全选和取消,基于JavaScript实现复选框的全选和取消全选
  7. java中自动装箱的问题
  8. spark算子_十、Spark之详解Action类算子
  9. python修改服务器ip,[python+Bat]读表修改机房IP
  10. c语言不定方程的二元一次,poj1061 - 同余方程,二元一次不定方程