当前位置:  数据库>oracle

Oracle arraysize 和 fetch size 参数与性能优化说明

    来源: 互联网  发布时间:2017-04-04

    本文导语: 一. 参数说明 1.1 arraysize 参数        Oracle sqlplus 有很多设置,这个在我之前的blog有说明:               Oracle sqlplus 常用命令总结          昨天和owind 讨论问题的时候,他强调了这个参数,通过一些测试,确实与性...

一. 参数说明

1.1 arraysize 参数

       Oracle sqlplus 有很多设置,这个在我之前的blog有说明:

              Oracle sqlplus 常用命令总结

 

       昨天和owind 讨论问题的时候,他强调了这个参数,通过一些测试,确实与性能这块有很大影响。

       Arraysize specifies how many rows SQL*Plus will fetch in a call. The number n can be between 1 and 5000.

 

       arraysize定义了一次返回到客户端的行数,当扫描了arraysize 行后,停止扫描,返回数据,然后继续扫描。

       这个过程就是统计信息中的SQL*Net roundtrips to/from client。因为arraysize 默认是15行,那么就有一个问题,因为我们一个block 中的记录数一般都会超过15行,所以如果按照15行扫描一次,那么每次扫描要多扫描一个数据块,一个数据块也可能就会重复扫描多次。

 

       重复的扫描会增加consistent gets 和 physical reads。 增加physical reads,这个很好理解,扫描的越多,物理的可能性就越大。

       consistent gets,这个是从undo里读的数量,Oracle 为了保证数据的一致性,当一个查询很长,在查询之后,数据块被修改,还未提交,再次查询时候,Oracle根据Undo 来构建CR块,这个CR块,可以理解成数据块在之前某个时间的状态。 这样通过查询出来的数据就是一致的。

       那么如果重复扫描的块越多,需要构建的CR块就会越多,这样读Undo 的机会就会越多,consistent gets 就会越多。

 

       如果数据每次传到客户端有中断,那么这些数据会重新扫描,这样也就增加逻辑读,所以调整arraysize可以减少传的次数,减少逻辑读。

 

       关于CR 参考我的Blog:

       CR (consistent read) blocks create 说明

      

 

       所以通过上面的说明,arraysize 参数如果过低,会影响如physical reads,consistent gets 还有SQL*Net roundtrips to/from client次数。

 

永久保存arraysize 参数:

       可以该参数保存到glogin.sql 或者login.sql 文件里,这样可以永久生效,不必每次都去set 指定。

 

-- 查看默认值

SYS@anqing2(rac2)> show arraysize

arraysize 15

 

--手工修改arraysize

SYS@anqing2(rac2)> set arraysize 100

SYS@anqing2(rac2)> show arraysize

arraysize 100

 

--修改glogin.sql

[oracle@rac2 admin]$ pwd

/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin

[oracle@rac2 admin]$ ls

glogin.sql  help  iplus  libisqlplus.def  libsqlplus.def  plustrce.sql  pupbld.sql

 

在glogin.sql里添加:

set arraysize 5000

 

--重新登陆,查询

SYS@anqing2(rac2)> show arraysize

arraysize 5000

 

 

1.2  fetch size 参数

       arraysize 和 fetch size 参数都是客户段的一个参数,需要在客户段来设置,arraysize 是在sqlplus 中设置的,如果我们通过程序去连数据库,那么这个参数就是Fetch size。 它的作用和arraysize 一样。 Fetch size 默认是10,一般改成50就ok了,太大会消耗内存。

 

       The JDBC fetch size gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed. For large queries that return a large number of objects you can configure the row fetch size used in the query to improve performance by reducing the number database hits required to satisfy the selection criteria. Most JDBC drivers (including Oracle) default to a fetch size of 10, so if you are reading 1000 objects, increasing the fetch size to 256 can significantly reduce the time required to fetch the query''s results. The optimal fetch size is not always obvious. Usually, a fetch size of one half or one quarter of the total expected result size is optimal. Note that if you are unsure of the result set size, incorrectly setting a fetch size too large or too small can decrease performance.

 

In this example application, I print out the default fetch size and then increase it to 50 using the setFetchSize(int) method of a Statement object. When you execute the query, the JDBC driver retrieves the first 50 rows from the database (or all rows if less than 50 rows satisfy the selection criteria). As you iterate over the first 50 rows, each time you call rset.next(), the JDBC driver returns a row from local memory – it does not need to retrieve the row from the database. When you try to access the fifty first row (assuming there are more than 50 rows that satisfy the selection criteria), the JDBC driver again goes to the database and retrieves another 50 rows. In this way, 100 rows are returned with only two database hits.

 

Alternatively, you can use the method setMaxRows() to set the limit for the maximum number of rows that any ResultSet can contain. If you specify a value of zero, then the hint is ignored: the JDBC driver returns one row at a time. The default value is zero.

 

如下连接是一个Jdbc 中配置Fetch size的示例。

http://www.idevelopment.info/data/Programming/java/jdbc/FetchSize.java

 

 

二. 相关测试

       每个block 中row的条数和row的大小也有关系,row 内容越多,那么block 中的row就会少。

 

每个block里有多少条记录,可以通过rowid 来判断。

       关于Oracle rowid说明,参考我的Blog

                     Oracle Rowid 介绍

                     Oracle中serveroutput参数一次设置永久保存方法 iis7站长之家

      

rowid 格式如下:OOOOOOFFFBBBBBBRRR, 其中:

(1)OOOOOO

       The data object number identifies the segment (data object AAAPec in Example 12-1). A data object number is assigned to every database segment. Schema objects in the same segment, such as a table cluster, have the same data object number.

(2)FFF

       The tablespace-relative data file number identifies the data file that contains the row (file AAF in Example 12-1).

(3)BBBBBB

       The data block number identifies the block that contains the row (block AAAABS in Example 12-1). Block numbers are relative to their data file, not their tablespace. Thus, two rows with identical block numbers could reside in different data files of the same tablespace.

(4)RRR

       The row number identifies the row in the block (row AAA in Example 12-1).

 

DAVE@anqing2(rac2)> create table dave as select * from sys.ta where rownum select owner,extents,segment_name,blocks from dba_segments where segment_name=''DAVE'' and owner=''DAVE'';

 

OWNER    EXTENTS SEGMENT_NAME       BLOCKS

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

DAVE       3  DAVE                   24

 

从这个数据算一个,1000行数据24个数据块。 平均下来每个数据块里有417条记录. 但事情情况可能不是这样.

 

--表结构很简单

DAVE@anqing2(rac2)> desc dave;

 Name                       Null?    Type

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

 ID                                NUMBER

 NAME                            VARCHAR2(10)

 

-- 查看rowid格式

DAVE@anqing2(rac2)> select rowid from dave where rownum=1;

ROWID

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

AAANXzAAHAAAAAMAAA

 

--查看每个数据块中有多少记录:

/* Formatted on 2011/7/1 14:59:56 (QP5 v5.163.1008.3004) */

  SELECT prerid, COUNT (rid) rid

    FROM (SELECT SUBSTR (ROWID, 1, 15) prerid, ROWID rid FROM dave)

GROUP BY prerid;

 

DAVE@anqing2(rac2)> select  prerid,count(rid) rid from (select  substr(rowid,1,15) prerid,rowid rid from dave) group by  prerid;

 

PRERID                                RID

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

AAANXzAAHAAAAAa                       517

AAANXzAAHAAAAAf                       517

AAANXzAAHAAAAAP                       517

AAANXzAAHAAAAAU                       517

AAANXzAAHAAAAAW                       517

AAANXzAAHAAAAAX                       517

AAANXzAAHAAAAAM                       524

AAANXzAAHAAAAAO                       517

AAANXzAAHAAAAAQ                       517

AAANXzAAHAAAAAS                       517

AAANXzAAHAAAAAY                       517

AAANXzAAHAAAAAR                       517

AAANXzAAHAAAAAg                       169

AAANXzAAHAAAAAN                       517

AAANXzAAHAAAAAT                       517

AAANXzAAHAAAAAV                       517

AAANXzAAHAAAAAb                       517

AAANXzAAHAAAAAe                       517

AAANXzAAHAAAAAc                       517

AAANXzAAHAAAAAd                       517

 

20 rows selected.

 

-- 这里只有20行,即实际只使用了20个数据块,每个数据块的记录如上查询结果,因为表的记录很简单,所以每个块中的记录很多。

 

       但是之前我们查询表占用了24个数据块,那么通过以下查询,可以理解为什么是24个blocks:


    
 
 

您可能感兴趣的文章:

  • Oracle Arraysize设置对于逻辑读的影响实例分析
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Oracle收购TimesTen 提高数据库软件性能
  • 关于提高Oracle数据库性能的四个错误认识
  • 用Oracle动态性能视图采集查询调优数
  • Oracle性能究极优化 上第1/2页
  • 用PHP连mysql比oracle数据库性能好
  • Oracle性能究极优化 下
  • 保持Oracle数据优良性能的技巧分享
  • 100分寻求最优化的连接oracle的java程序,请给我讲出理由,我是初学者,在做项目时不想让连接oracle影响我的程序性能
  • Oracle数据库应用程序性能优化探究
  • oracle 使用递归的性能提示测试对比
  • 善用Oracle表空间设计提升数据库性能
  • Oracle性能究极优化
  • Oracle SQL性能优化系列学习一
  • Oracle SQL性能优化系列学习三
  • Linux平台下如何监控Oracle数据库的性能
  • Oracle SQL性能优化系列学习二
  • 性能陷阱:Oracle表连接中范围比较
  • 基于Oracle的高性能动态SQL程序开发
  • 浅谈Oracle性能优化可能出现的问题
  • 如何保持Oracle数据库的优良性能
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 深入解析Oracle参数及参数文件
  • Oracle数据库访问参数文件的顺序
  • Oracle初始参数与当前用户
  • Oracle中serveroutput参数一次设置永久保存方法
  • Oracle的spfile参数文件
  • Linux Oracle RAC内核参数
  • 怎么在java中向一个sql语句传参数,就像oracle的proc一样啊?
  • Sun Solaris运行Oracle数据库所需的内核参数
  • Linux下用SHELL脚本执行带输入输出参数的ORACLE存储过程并得到结果
  • Oracle Streams存储过程中的一些参数
  • 快速修复Oracle参数文件的另类方法
  • jps连接oracle9i数据库出现内部参数错
  • oracle 参数文件audit_trail的认识
  • 在linux下安装oracle时,使用sysctl检查系统参数时出现许多error信息,不知道怎么回事,望高手指点!
  • 每日Oracle:配置日志模式的相关参数log_archive_des
  • Oracle 子程序参数模式,IN,OUT,NOCOPY
  • Oracle 使用set修改数据库运行参数
  • oracle impdp network_link参数使用介绍
  • Oracle数据库中系统初始化参数分析
  • Oracle 启动例程 STARTUP参数说明
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3