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,一经查实,立即删除!

相关文章

最小c编译器

最小c编译器&#xff08;来源 &#xff08;最好在linux下操作&#xff09;&#xff09;代码有好几个版本&#xff0c;我选择otccelfn.c 。 /*Obfuscated Tiny C Compiler with ELF outputCopyright (C) 2001-2003 Fabrice BellardThis software is provided as-is, without any…

在Java中使用Collat​​or和String类进行字符串比较

Given two strings and we have to compare them using Collator and String classed in Java. 给定两个字符串&#xff0c;我们必须使用Java中分类的Collat​​or和String进行比较。 Using Collator class – to compare two strings, we use compare() method – it returns…

Oracle数据库中表格的级联删除问题

数据库表中没有设置级联删除.怎样用SQL语句实现:如:EMP表中有字段DEPT_NO是外键POS表中有字段DEPT_NO是外键DEPT表中有字段DEPT_NO,如何实现删除DEPT表中数据时将EMP表,POS表中的相关数据也删除;这里有两种方法&#xff1a;方法一&#xff1a;触发器解决create or replace trig…

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&…

在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别

【在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别 】1.CHAR(size)和VARCHAR(size)的区别 CHAR为定长的字段&#xff0c;最大长度为2K字节&#xff1b; VARCHAR为可变长的字段&#xff0c;最大长度为4K字节&#xff1b; 2.CHAR(size)和NCHAR(size)的区别 CHA…

Android 照相功能

使用内置的Camera 应用程序捕获图像 探索Android 所提供的内置功能&#xff0c;内置的图像捕获与存储功能为Android 上全部媒体功能提供了一个非常好的切入点&#xff0c;为我们在以后的章节中处理音频和视频奠定了基础。如今介绍怎样利用内置的Camera&#xff08;摄像头&#…

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

皮尔逊相关性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;译者对译文不拥有任何权利并且不…

oracle的nvl和nvl2

NVL( string1, replace_with) 功能&#xff1a;如果string1为NULL&#xff0c;则NVL函数返回replace_with的值&#xff0c;否则返回string1的值&#xff0c;如果两个参数都为NULL &#xff0c;则返回NULL。NVL2(expr1,expr2,expr3)功能&#xff1a;oracle中常用函数&#xff0c…

Java SecurityManager checkAwtEventQueueAccess()方法与示例

SecurityManager类的checkAwtEventQueueAccess()方法 (SecurityManager Class checkAwtEventQueueAccess() method) checkAwtEventQueueAccess() method is available in java.lang package. checkAwtEventQueueAccess()方法在java.lang包中可用。 checkAwtEventQueueAccess() …

绝了,几款主流的 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官…

Dynamic_Performance_Tables_not_accessible_问题_解决不能动态统计

Dynamic Performance Tables not accessible, Automatic Statistics Disabled for this session You can disable statistics in the preference menu,or obtanin select priviliges on the v$session,v$sesstat and v$statname tables第一种处理方法&#xff08;不推荐&#x…

ruby三元操作符_在Ruby中使用操作符将元素添加到数组实例中

ruby三元操作符In the previous articles, we have gone through ways through which we can create Array instances. Some of them were Public instance methods and some were Public class methods. We should also know how they both differ from each other. Now we kn…

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

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

c语言给定一个非空整数数组_C程序检查给定整数的所有位是否为一(1)

c语言给定一个非空整数数组Problem statement: Write a C Program to check if all the bits of a given integer is one (1). 问题陈述&#xff1a;编写一个C程序来检查给定整数的所有位是否都是一(1) 。 Solution: We can use bitwise operator here to solve the problem. …