通过案例学调优之--Oracle参数(db_file_multiblock_read_count)

通过案例学调优之--Oracle参数(db_file_multiblock_read_count)

应用环境:

操作系统: RedHat EL55

Oracle:   Oracle 10gR2

  Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数,可以影响系统级别及sessioin级别。主要是用于设置最小化表扫描时Oracle一次按顺序能够读取的数据块数。通常情况下,我们看到top events中的等待事件db file scattered read时会考虑到增加该参数的值。

1、参数DB_FILE_MULTIBLOCK_READ_COUNT(MBRC)
       参数DB_FILE_MULTIBLOCK_READ_COUNT简写为(MBRC)。
       该参数是最小化表扫描的重要参数,用于指定Oracle一次按顺序能够读取的数据块数。理论上该值越大则能够读取的数据块越多。
       实现全表扫描,索引全扫描及索引快速扫描所需的I/O总数取决于该参数,以及表自身的大小,是否使用并行等等。
       Oracle 10gR2以后会根据相应的操作系统及buffer cache以最优化的方式来自动设定该参数的值。通常情况下该值为1MB/db_block_size。
       在最大I/O为1MB的情况下,block的大小为8KB,则参数的值为128。如果在最大I/O为64KB,block为8KB,则参数的值为8。

       对于OLTP和batch环境该参数的值为4到16,DSS环境应设置大于16以上或大的值。
       该参数的变化对数据库性能产生整体性的影响,过大的设置会导致大量SQL访问路径发生变化,如原先的索引扫描倾向于使用全表扫描。
       按照Oracle的建议在10g R2之后尽可能使用oracle自动设置的值。

2、参数DB_FILE_MULTIBLOCK_READ_COUNT与SSTIOMAX
     In Release 9.2 and above; follow the explanation below:
     Each version of Oracle on each port, is shipped with a preset maximum of how much data can be transferred in a single read (which of course is equivalent to the db_file_multiblock_read_count since the block size is fixed). 
     For 8i and above (on most platforms) this is 1Mb and is referred to as SSTIOMAX.
     To determine it for your port and Oracle version, simply set db_file_multiblock_read_count to a nonsensical value and Oracle will size it down for you.
     从上面的描述可知,Oracle 9.2之后,有一个名叫SSTIOMAX的东东,限制了MBRC的设置。
     由于SSTIOMAX大多数平台最大单次I/O为1MB,db_block_size为8kb,因此MBRC参数的最大值通常为128。128*8kb=1mb。
     对于设置大于1MB的情形,即MBRC*db_block_size>SSTIOMAX的情形,则设置的值并不生效,而是使用符合SSTIOMAX的最大MBRC值。

3、如何计算MBRC
     The formula as internally used is as below:
         db_file_multiblock_read_count = min(1048576/db_block_size , db_cache_size/(sessions * db_block_size))

设置DB_FILE_MULTIBLOCK_READ_COUNT以充分利用操作系统I/O缓冲区的大小。应考虑DB_FILE_MULTIBLOCK_READ_COUNT <= 操作系统I/O缓冲区 / Oracle Block的大小,如果DB_FILE_MULTIBLOCK_READ_COUNT设置的太大,会使优化器认为全表扫描更有效而改变执行计划,然后实际情况并非如此。

如果必须创建小的区间,创建其大小是操作系统I/O缓冲区大小的整数倍

设置区间尺寸大小的考虑思路应该是合理的利用Oracle的能力以便在全表扫描时执行多块存取,同时读操作又是不能跨区间的。举个例子,假设操作系统I/O缓冲区大小是64KB,考察读取一个640KB大小的表,如果设置为每个区间64KB,一共10个区间,如果执行全表扫描,则Oracle需要10次读操作(相当于一次读一个区间);如果设置为一个640KB的区间,则Oracle还是需要10次读操作(因为操作系统I/O缓冲区大小是64KB),可见压缩区间并不能提高性能;如果设置为每个区间80KB,一共8个区间,则每个区间Oracle需要读两次,第一次读64KB,第二次读这个区间剩余的16KB(读操作不能跨区间),所以总共需要16次读操作(相当于一次读一个区间)。区间尺寸的设置对性能的影响是显而易见的。

案例分析:

案例1

15:21:10 [email protected] test1 >show parameter mult

NAME                                 TYPE        VALUE

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

db_file_multiblock_read_count        integer     128

1)查看表中extent分配

14:46:03 [email protected] test1 >col segment_name for a20

14:46:15 [email protected] test1 >select segment_name,extent_id,bytes,blocks from user_extents

14:46:36   2   where segment_name=‘T1‘;

SEGMENT_NAME          EXTENT_ID      BYTES     BLOCKS
-------------------- ---------- ---------- ----------
T1                            0      65536          8
T1                            1      65536          8
T1                            2      65536          8
T1                            3      65536          8
T1                            4      65536          8
T1                            5      65536          8
T1                            6      65536          8
T1                            7      65536          8
T1                            8      65536          8
T1                            9      65536          8
T1                           10      65536          8
T1                           11      65536          8
T1                           12      65536          8
T1                           13      65536          8
T1                           14      65536          8
T1                           15      65536          8
T1                           16    1048576        128
SEGMENT_NAME          EXTENT_ID      BYTES     BLOCKS
-------------------- ---------- ---------- ----------
T1                           17    1048576        128
T1                           18    1048576        128
T1                           19    1048576        128
T1                           20    1048576        128
T1                           21    1048576        128
22 rows selected.

2)配置10046进行分析

14:48:00 [email protected] test1 >alter session set events ‘10046 trace name context forever,level 8‘;
Session altered.

14:48:57 [email protected] test1 >select count(*) from t1;
  COUNT(*)
----------
      5002

14:49:09 [email protected] test1 >alter session set events ‘10046 trace name context off‘;
Session altered.

3)查看trace文件

[[email protected] ~]$ more  /u01/app/oracle/diag/rdbms/test1/test1/trace/test1_ora_4160.trc

WAIT #2: nam=‘db file sequential read‘ ela= 9 file#=11 block#=691 blocks=1 obj#=16394 tim=1408604404294713
WAIT #2: nam=‘Disk file operations I/O‘ ela= 26 FileOperation=2 fileno=4 filetype=2 obj#=16394 tim=1408604404294846
WAIT #2: nam=‘db file sequential read‘ ela= 9 file#=4 block#=143 blocks=1 obj#=16394 tim=1408604404294872
WAIT #2: nam=‘db file scattered read‘ ela= 23 file#=4 block#=157 blocks=3 obj#=16394 tim=1408604404294998
WAIT #2: nam=‘db file sequential read‘ ela= 8 file#=4 block#=164 blocks=1 obj#=16394 tim=1408604404295041
WAIT #2: nam=‘db file sequential read‘ ela= 8 file#=11 block#=727 blocks=1 obj#=16394 tim=1408604404295069
WAIT #2: nam=‘db file sequential read‘ ela= 8 file#=4 block#=183 blocks=1 obj#=16394 tim=1408604404295097
WAIT #2: nam=‘db file scattered read‘ ela= 33 file#=4 block#=187 blocks=5 obj#=16394 tim=1408604404295156
WAIT #2: nam=‘db file sequential read‘ ela= 8 file#=4 block#=199 blocks=1 obj#=16394 tim=1408604404295191
WAIT #2: nam=‘db file scattered read‘ ela= 51 file#=11 block#=153 blocks=8 obj#=16394 tim=1408604404295272
WAIT #2: nam=‘db file scattered read‘ ela= 50 file#=11 block#=203 blocks=8 obj#=16394 tim=1408604404295355
WAIT #2: nam=‘db file scattered read‘ ela= 52 file#=11 block#=213 blocks=8 obj#=16394 tim=1408604404295442
......

从以上文件可以看出,在“db file scattered read”中每次读取的数据块个数(blocks=8)不超过extent中blocks的大小(8个);在“db file sequential read”中每次读取的数据块个数(blocks)为1个。

案例2:

15:21:10 [email protected] test1 >show parameter mult

NAME                                 TYPE        VALUE

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

db_file_multiblock_read_count        integer     128

1)创建新的segment

15:08:28 [email protected] test1 >create table t2 (id int)

15:08:35   2  storage (initial 2048k next 2048k pctincrease 0);

Table created.

15:08:41 [email protected] test1 >col segment_name for a20

15:08:53 [email protected] test1 >select segment_name,tablespace_name,extent_id,bytes,blocks from user_extents

15:09:19   2   where segment_name=‘T2‘;

SEGMENT_NAME         TABLESPACE_NAME                 EXTENT_ID      BYTES     BLOCKS
-------------------- ------------------------------ ---------- ---------- ----------
T2                   USERS                                   0    1048576        128
T2                   USERS                                   1    1048576        128

2)配置10046进行分析

15:11:00 [email protected] test1 >alter session set events ‘10046 trace name context forever,level 8‘;
Session altered.

15:14:57 [email protected] test1 >select count(*) from t2;
  COUNT(*)
----------
      32002

15:15:09 [email protected] test1 >alter session set events ‘10046 trace name context off‘;
Session altered.

3)查看trace文件

[[email protected] ~]$ more  /u01/app/oracle/diag/rdbms/test1/test1/trace/test1_ora_4260.trc

PARSE #5:c=0,e=302,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,plh=0,tim=1408605696796384
EXEC #5:c=1000,e=1131,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,plh=3321871023,tim=1408605696797594
WAIT #5: nam=‘db file sequential read‘ ela= 75 file#=11 block#=512 blocks=1 obj#=16404 tim=1408605696797838
WAIT #5: nam=‘db file sequential read‘ ela= 15 file#=11 block#=514 blocks=1 obj#=16404 tim=1408605696797913
WAIT #5: nam=‘db file scattered read‘ ela= 1123 file#=11 block#=528 blocks=48 obj#=16404 tim=1408605696799202

从以上文件可以看出,在“db file scattered read”中每次读取的数据块个数(blocks=48)不超过extent中blocks的大小(128个);在“db file sequential read”中每次读取的数据块个数(blocks)为1个。

附注:

通过案例学调优之--Oracle参数(db_file_multiblock_read_count)

时间: 2024-10-16 15:09:40

通过案例学调优之--Oracle参数(db_file_multiblock_read_count)的相关文章

通过案例学调优之--RECORDS_PER_BLOCK参数

通过案例学调优之--RECORDS_PER_BLOCK参数      RECORDS_PER_BLOCK参数用于设定每个BLOCK中记录数的最大值,其先找到当前表所有BLOCK中容纳的最大行数,并会把这个数字记录到数据字典,以后任何导致BLOCK行数超过这个数字的插入都会被拒绝. RECORDS_PER_BLOCK参数是为位图索引而生的,能够改善位图索引的存储,减小位图索引的长度.这样,利用该位图索引的时候,就能获得比较好的效率了.     测试案例: 1.表默认的存储分析 15:45:46 [

通过案例学调优之--Oracle Cluster Table

通过案例学调优之--Oracle Cluster Table About Clusters A cluster provides an optional method of storing table data. A cluster is made up of a group of tables that share the same data blocks. The tables are grouped together because they share common columns an

通过案例学调优之--Oracle 全文索引

通过案例学调优之--Oracle 全文索引 全文检索(oracle text)  Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力,Oracle Text 是 Oracle9i 采用的新名称,在 oracle8/8i 中被称为 oracle intermedia text,oracle8 以前是 oracle context cartridge.Oracle Text 的索引和查找功能并不局限于存储在数据库中的数据. 它可以对存储于文件系统中的文档进行检索和

通过案例学调优之--Oracle Time Model(时间模型)

通过案例学调优之--Oracle Time Model(时间模型) 数据库时间  优化不仅仅是缩短等待时间.优化旨在缩短最终用户响应时间和(或)尽可能减少每个请求占用的平均资源.有时这些目标可同时实现,而有时则需要进行折衷(如在并行查询时).通常可以认为,优化就是避免以浪费的方式占用或保留资源. 对数据库发出的任何请求都由两个不同的段组成:等待时间(数据库等待时间)和服务时间(数据库 CPU 时间).等待时间是各种数据库实例资源的所有等待时间的总和.CPU 时间是实际处理请求时消耗的时间的总和.

通过案例学调优之--Oracle中null使用索引

通过案例学调优之--Oracle中null使用索引  默认情况下,Oracle数据库,null在Index上是不被存储的,当在索引列以"is null"的方式访问时,无法使用索引:本案例,主要向大家演示如何在存在null的索引列上,使用"is null"访问索引. 案例分析: 1.建立表和普通索引 13:52:23 [email protected] prod >create table t2 (x int,y int); Table created. 14:

通过案例学调优之--Oracle数据块(block)

数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节(byte).每种操作系统都有一个被称为块容量(block size)的参数.Oracle每次获取数据时,总是访问整个数(Oracle)数据块,而不是按照操作系统块的容量访问数据. 数据库中标准的数据块(data block)容量是由初始化参数 DB_BLOCK_SIZE 指定的.

通过案例学调优之--AWR BaseLine管理

通过案例学调优之--AWR BaseLine管理 BaseLine Baseline 是指一个特定时间段内的性能数据,保留这些数据是为了在性能问题产生时与其他类似的工作负载时间段进行比较.Baseline 中包含的快照将从自动 AWR 清理进程中排除,并无限期的保留. 在 Oracle Database 中存在多种类型的 baseline:      Fixed Baseline:fixed baseline 表示的是您指定的一个固定的.连续的时间段.在创建 fixed baseline 之前,

通过案例学调优之--SQL Profile

通过案例学调优之--SQL Profile 一.什么是SQL Profile(概要) SQL Profile在性能优化中占有一个重要的位置. MOS里这么描述SQL Profile: SQL Profile是10g中的新特性,作为自动SQL调整过程的一部分,由Oracle企业管理器来管理.除了OEM,SQL Profile可以通过DBMS_SQLTUNE包来进行管理. 查询优化器有时候会因为缺乏足够的信息,而对一条SQL语句做出错误的估计,生成糟糕的执行计划.而自动SQL调整通过SQL概要分析来

通过案例学调优之--AWR基本概念

通过案例学调优之--AWR基本概念 一.Automatic Workload Repository 概念详解 Automatic Workload Repository (AWR) 收集.处理和维护用于问题诊断的性能统计信息.该数据既存在于数据块中,也存在于内存中.AWR 收集的数据可以通过报告和视图进行查看. AWR 处理和收集的统计信息包括: 1.确定数据块 segment 访问路径和使用情况的对象统计信息 2.基于数据库活动的时间使用情况的时间模型统计信息,可在 V$SYS_TIME_MO