PLSQL_性能优化系列10_Oracle Array

2014-09-25 BaoXinjian

一、摘要



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

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

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

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

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

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

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



1.  Sqlplus的arraysize  Sqlplus的arraysize参数表示数据库一次返回给客户端的行数,缺省是15。如果返回数据量大,可以调大此参数:

Set arraysize nnnn

该参数最大为5000

测试一:缺省arraysize

select * from test_table where rownum <100000;

99999 rows selected.

lapsed: 00:00:06.12

Statistics

----------------------------------------------------------

4573

recursive calls

测试二:SQL> set arraysize 1000

select * from test_table where rownum <100000;

99999 rows selected.

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



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

select a.name name, b.value

from v$statname a, v$mystat b

where a.statistic# = b.statistic# and (a.name) in( ‘consistent gets‘)

order by name;

100759

declare

cursor c1 is select user_id from test_table where rownum<100000;

v_id varchar2(30);

begin

open c1;

loop

FETCH c1 INTO v_id;

exit when c1%notfound;

null;

end loop;

close c1;

end;
/

select a.name name, b.value  
from v$statname a, v$mystat b  
where a.statistic# = b.statistic# and (a.name) in( ‘consistent gets‘)
order by name;

测试二:设置bulk collect,一次取100条 select a.name name, b.value
  from v$statname a, v$mystat b
   where a.statistic# = b.statistic# and (a.name) in( ‘consistent gets‘)    order by name; 110129 declare
TYPE VarcharTab IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER; cursor c1 is select user_id from test_table where rownum<100000; v_id VarcharTab; begin
   open c1;    loop
   FETCH c1 BULK COLLECT INTO v_id LIMIT 100;    exit when c1%notfound;  
   null;    end loop;    close c1; end; /
Elapsed: 00:00:00.09
select a.name name, b.value
  from v$statname a, v$mystat b
   where a.statistic# = b.statistic# and (a.name) in( ‘consistent gets‘)    order by name; 113001

测试三:设置bulk collect,一次取5000条 declare
TYPE VarcharTab IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER; cursor c1 is select user_id from test_table where rownum<100000; v_id VarcharTab; begin
   open c1;    loop
   FETCH c1 BULK COLLECT INTO v_id LIMIT 5000;    exit when c1%notfound; 
   null;    end loop;    close c1; end; /

Elapsed: 00:00:00.08
select a.name name, b.value
  from v$statname a, v$mystat b
   where a.statistic# = b.statistic# and (a.name) in( ‘consistent gets‘)    order by name;  
 114905

********************作者:鲍新建********************

时间: 2024-08-03 01:43:51

PLSQL_性能优化系列10_Oracle Array的相关文章

PLSQL_性能优化系列16_Oracle DataScan数据扫描

对数据的读取操作是非常消耗资源的,如何减少对数据的扫描,是提升sql效率的一个重要方面,例如物化视图技术.本篇介绍几种sql写法,分别是CASE expression/DML with returning clause /multitable insert.[@[email protected]] 一. 用CASE EXPRESSION将多句查询组合在一起SELECT COUNT (*)FROM employeesWHERE salary < 2000;SELECT COUNT (*)FROM

PLSQL_性能优化系列01_Oracle Index索引

2014-06-01 BaoXinjian 一.摘要 在PLSQL查询优化中,使用和接触最多的应该是索引Index这个概念,个人也觉得对Index选择和优化是程式优化过程中比较重要的概念,特别是刚开始接触PLSQL性能优化 索引的一些概念 一个索引可以由一个或多个列组成, 对列设置索引其实就是对列的内容按一定的方式进行排序,检索数据的时候,检索排过序的数据,检索到最后一个有效数据之后就跳出检索 这样就不必进行全表扫描了,同时可以应用很多算法提高检索效率 数据库多用二分法检索数据 索引的连接方式

PLSQL_性能优化系列04_Oracle Optimizer优化器

2014-09-25 BaoXinjian 一.摘要 1. Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. 2. RBO优化器 RBO是一种基于规则的优化器,随着CBO优化器的逐步发展和完善,在最新的10g版本中Oracle已经彻底废除了RBO. 正在使用Oracle8i或9i的人们或多或少的都会碰到RBO,因此在详细介绍CBO之前,我们有必要简单回顾一下古

PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化

2014-09-25 BaoXinjian 一.Insert 性能影响 应用设计不合理导致的session之间的互锁(enqueue)是影响程序可扩展性最常见的原因.此外,一些共享资源的争用,也会导致性能下降. 本篇介绍两个由并发insert操作导致的等待事件(wait event),以及如何通过优化物理设计来进行改善. 普通Insert操作本身产生的是行锁,因此进程相互之间不会锁住(enqueue),但当很多进程insert同一张表时,会有资源上冲突. 以下是两个例子: 1. Buffer b

PLSQL_性能优化系列06_Oracle Soft Parse / Hard Parse软硬解析

2014-08-11 BaoXinjian 一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 1. SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析. 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限). Step2. 将SQL代码的文本进行哈希得到哈希值. Step3. 如果共享

PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量

2014-09-25 BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量往往是影响oracle性能和扩展性的最大问题 以下为一些错误写法和正确写法的例子 1. PLSQL中普通查询 (1). 错误写法 SELECT * FROM emp WHERE empno=123; (2). 正确写法(未使用绑定变量) Empno:=123;SEELCT* FROM emp WHERE empno=:e

PLSQL_性能优化系列02_Oracle Join关联

2014-09-25 BaoXinjian 一.摘要 Oracle三种主要连接方式的比较 1. Hash Join (1).概述 i. 读取一个表的资料,并将放置到内存中,并建立唯一关键字的位图索引 ii. 读取另一个表,和内存中表通过Hash算法进行比较 (2).适用对象 i. 大表连接小表 ii. 两个大表 2. Nested Loops (1).概述 i. 循环外表记录 ii. 进行逐个比对和内标的连接是否符合条件 (2).适用对象 小表驱动大表,返回较少的结果集 3. Merge Joi

PLSQL_性能优化系列05_Oracle Hint提示

2014-06-20 BaoXinjian 一.摘要 手工指定SQL语句的执行计划 尽管oracle优化器很智能,但有时候你想自己选择执行计划,可以通过hint实现.在开发测试环境中,可以通过hint测试不同执行计划的性能. Hint的缺点是增加了管理代码的额外负担,当数据库或环境发生变化时,如果不修改hint,可能导致性能下降.例如,代码中用hint指定索引,但重建索引时索引名变化. 因此oracle建议使用hint测试性能后,用其他工具来管理执行计划,如oracle 10g以后的sql tu

PLSQL_性能优化系列14_Oracle Index Anaylsis索引分析

2014-10-04 BaoXinjian 一.摘要 1. 索引质量 索引质量的高低对数据库整体性能有着直接的影响. 良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置. 因此对于索引在设计之初需要经过反复的测试与考量. 那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能. 2. 索引创建的基本指导原则 索引的创建应遵循精而少的原则 收集表上所有查询的各种不同