请通过浏览器功能收藏网页

Oracle运行缓慢 内存分析参数说明汇总(一) 数据库问题

发布时间:2018-08-07 11:07:41  作者:本站编辑  来源:本站原创  浏览次数:
www.javainfo.com.cn 上干货 欢迎收藏

当Oracle数据库运行缓慢的时候,我们需要对其内存进行调优, 调优的依据 就是分析 当前数据库的各个参数信息, 如排序SQL效率等 , 下面的用到的一些常用参数获取, 我将其汇总到了一起


查看、修改ORACLE最大进程数

  

查看ORACLE最大进程数:

SQL> select count(*) from v$session  #连接数

SQL> Select count(*) from v$session where status='ACTIVE' #并发连接数

SQL> show parameter processes  #最大连接

SQL> alter system set processes = value scope = spfile;重启数据库  #修改连接


unix 1个用户session 对应一个操作系统 process 

而 windows体现在线程


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

修改ORACLE最大进程数:

使用sys,以sysdba权限登录:


SQL> show parameter processes;


NAME                                 TYPE        VALUE

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

aq_tm_processes                      integer     1

db_writer_processes                  integer     1

job_queue_processes                  integer     10

log_archive_max_processes            integer     1

processes                            integer     150


SQL> alter system set processes=300 scope = spfile;


系统已更改。


SQL> show parameter processes;


NAME                                 TYPE        VALUE

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

aq_tm_processes                      integer     1

db_writer_processes                  integer     1

job_queue_processes                  integer     10

log_archive_max_processes            integer     1

processes                            integer     150


SQL> create pfile from spfile;


文件已创建。

 


重启数据库,

 

SQL> show parameter processes;


NAME                                 TYPE        VALUE

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

aq_tm_processes                      integer     1

db_writer_processes                  integer     1

job_queue_processes                  integer     10

log_archive_max_processes            integer     1

processes                            integer     300

 

搞定!




专用服务器:一个客户端连接对应一个服务器进程

共享服务器:多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理。

判断oracle是共享模式还是专用模式用以下方法:

show parameter shared_server; 

如果数值> 0 ,就是enable了共享服务器。



oracle查询共享池的大小的命令为:

SQL> show parameter shared_pool_size

或者

SQL> select * from v$sgastat where name = 'free memory' and pool = 'shared pool';



注:以下指标取自Oracle的性能分析工具Statspack所提供的性能分析指标。



指标名称   指标描述  指标范围   指标单位


1.关于实例效率(Instance Efficiency Percentages)的性能指标

缓冲区未等待率

(Buffer Nowait %)


指在缓冲区中获取Buffer的未等待比率。

该指标的值应接近100%,如果该值较低,则可能要增大buffer cache。%


Redo缓冲区未等待率

(Redo NoWait %)


指在Redo缓冲区获取Buffer的未等待比率。


该指标的值应接近100%,如果该值较低,则有2种可能的情况:


1.online redo log没有足够的空间;


2.log切换速度较慢。%


缓冲区命中率


(Buffer Hit %)


指数据块在数据缓冲区中的命中率。


该指标的值通常应在90%以上,否则,需要调整。如果持续小于90%,可能要加大db_cache_size。但有时,缓存命中率低并不意味着


cache设置小了,可能是潜在的全表扫描降低了缓存命中率。


%


内存排序率


(In-memory Sort %)


指排序操作在内存中进行的比率。当查询需要排序的时候,数据库会话首先选择在内存中进行排序,当内存大小不足的时候,将使


用临时表空间进行磁盘排序,但磁盘排序效率和内存排序效率相差好几个数量级。


该指标的值应接近100%,如果指标的值较低,则表示出现了大量排序时的磁盘I/O操作,可考虑加大sort_area_size参数的值。


%


共享区命中率


(Library Hit%)


该指标主要代表sql在共享区的命中率。


该指标的值通常应在95%以上,否则需要考虑加大共享池(修改shared_pool_size参数值),绑定变量,修改cursor_sharing等参数



%


软解析的百分比


(Soft Parse %)


该指标是指Oracle对sql的解析过程中,软解析所占的百分比。软解析(soft parse)是指当Oracle接到Client提交的Sql后会首先


在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql。当发现有相同的Sql就直接用


之前解析好的结果,这就节约了解析时间以及解析时候消耗的CPU资源。


该指标的值通常应在95%以上,如果低于80%,那么就可能sql基本没被重用,sql没有绑定变量,需要考虑绑定变量。


%


闩命中率


 (Latch Hit%)


指获得Latch的次数与请求Latch的次数的比率。


 


该指标的值应接近100%,如果低于99%,可以考虑采取一定的方法来降低对Latch的争用。


%


SQL语句执行与解析的比率


(Execute to Parse %)


指SQL语句执行与解析的比率。SQL语句一次解析后执行的次数越多,该比率越高,说明SQL语句的重用性很好。


该指标的值应尽可能到高,如果过低,可以考虑设置

session_cached_cursors参数。%


共享池内存使用率


(Memory Usage %)


该指标是指在采集点时刻,共享池(share pool)内存被使用的比例。


这指标的值应保持在75%~90%,如果这个值太低,就浪费内存,如果太高,会使共享池外部的组件老化,如果SQL语句被再次执行,则


就会发生硬分析。


%


2.关于等待事件(Wait events)的性能指标


文件分散读取


(db file scattered read(cs))


该等待事件通常与全表扫描有关。因为全表扫描是被放入内存中进行的进行的,通常情况下它不可能被放入连续的缓冲区中,所以


就散布在缓冲区的缓存中。


如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或没有创建合适的索引。尽管在特定条件下执行全表


扫描可能比索引扫描更有效,但如果出现这种等待时,最好检查一下这些全表扫描是否必要。


厘秒


文件顺序读取


(db file sequential read(cs))


该等待事件通常与单个数据块相关的读取操作有关。


如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,或者可能不合适地使用了索引。对于大量事务处理


、调整良好的系统,这一数值大多是很正常的,但在某些情况下,它可能暗示着系统中存在问题。应检查索引扫描,以保证每个扫


描都是必要的,并检查多表连接的连接顺序。另外DB_CACHE_SIZE也是这些等待出现频率的决定因素。


厘秒


缓冲区忙


(buffer busy(cs))


当一个会话想要访问缓存中的某个块,而这个块正在被其它会话使用时,将会产生该等待事件。这时候,其它会话可能正在从数据


文件向缓存中的这个块写入信息,或正在对这个块进行修改。


出现这个等待事件的频度不应大于1%。如果这个等待事件比较显著,则需要根据等待事件发生在缓存中的哪一块(如字段头部、回


退段头部块、回退段非头部块、数据块、索引块等),采取相应的优化方法。


厘秒 


(enqueue(cs))


enqueue是一种保护共享资源的锁定机制。该锁定机制保护共享资源,如记录中的数据,以避免两个人在同一时间更新同一数据。


enqueue包括一个排队机制,即FIFO(先进先出)排队机制。注意:Oracle的latch机制不是FIFO。Enqueue等待通常指的是ST enqueue


、HW enqueue、TX4 enqueue和TM enqueue。


如果enqueue等待事件比较显著,则需要根据enqueue等待类型,采取相应的优化方法。


厘秒


闩释放


(latch free(cs))


该等待事件意味着进程正在等待其他进程已持有的latch。


latch是一种低级排队机制(它们被准确地称为相互排斥机制),用于保护系统全局区域(SGA)中共享内存结构。latch就像是一种快速


地被获取和释放的内存锁。latch用于防止共享内存结构被多个用户同时访问。


对于常见的Latch等待通常的解决方法:


1)Share pool latch:在OLTP应用中应该更多的使用绑定变量以减少该latch的等待。


2)Library cache latch:同样的需要通过优化sql语句使用绑定变量减少该latch的等待。


厘秒


日志文件同步


(log file sync(cs))


这个等待事件是指当一个会话完成一个事务(提交或者回滚数据)时,必须等待LGWR进程将会话的redo信息从日志缓冲区写到日志


文件后,才能继续执行下去。


这个等待事件的时间过长,可能是因为commit太频繁或者lgwr进程一次写日志的时间太长(可能是因为一次log io size太大),可


调整_log_io_size,结合log_buffer,使得(_log_io_size*db_block_size)*n = log_buffer,这样可避免和增大log_buffer引起冲


突,或者可以将日志文件存放在高速磁盘上


厘秒

Oracle缓冲块(datablock)的状态类型

       事实上,Oracle使用v$bh视图来记录与数据缓冲(data buffer)相关的信息,它详细记录了数据缓冲中每一个数据块(data 


block)的状态信息。

  在v$bh视图中的status字段,记录了数据块的状态,在非OPS、非RAC这样的集群环境中,数据块的状态会是下列几种之一:


xcur,cr,read,free,用户可以通过如下命令得到数据库的状态信息:

  SQL> select unique status from v$bh;

  其状态的意义分别是:

  xcur:(exclusive current)的意思,表示该数据块处于排外模式;

  cr:表示该数据块是一个克隆(clone)的数据库,可以执行共享的只读操作;

  free:表示这是一个限制的数据块,oracle现在没有使用它;

  read:表示该数据块正在从磁盘读取数据;

  write:表示数据库正在往磁盘写入数据;

  在数据库恢复过程中,该字段还有另外两个描述:mrec和irec:

  mrec:(media recovery)表示数据块处于介质恢复模式;

  irec:(instance recovery)表示数据块处于实例恢复模式;

  在RAC环境中,数据块还有另外一种模式:

  scur (shared current),表示该数据库正在和其他实例共享数据。


一、等待事件的相关知识

1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件。

1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件。

2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件 是在调整数据库的时候需


要关注与研究的。

在Oracle 10g中的等待事件有872个,11g中等待事件1116个。 我们可以通过v$event_name 视图来查看等待事件的相关信息。

 

1.2 查看v$event_name视图的字段结构


SQL> desc v$event_name;

  名称                    是否为空    类型

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

 EVENT#                       NUMBER

 EVENT_ID                      NUMBER

 NAME                         VARCHAR2(64)

 PARAMETER1                  VARCHAR2(64)

 PARAMETER2                  VARCHAR2(64)

 PARAMETER3                  VARCHAR2(64)

 WAIT_CLASS_ID               NUMBER

 WAIT_CLASS#                NUMBER

 WAIT_CLASS                  VARCHAR2(64)

 

1.3 查看等待事件分类情况


    SELECT 

      wait_class#,

              wait_class_id,

              wait_class,

              COUNT ( * ) AS "count"

    FROM  v$event_name

   GROUP BY  wait_class#, wait_class_id, wait_class

   ORDER BY  wait_class#;

 WAIT_CLASS#   WAIT_CLASS_ID   WAIT_CLASS                 count

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

          0        1893977003       Other                        717

          1        4217450380       Application                    17

          2        3290255840       Configuration                 24

          3        4166625743       Administrative               54

          4        3875070507       Concurrency                  32

          5        3386400367       Commit                         2

          6        2723168908       Idle                              94

          7        2000153315       Network                        35

          8        1740759767       User I/O                        45

          9        4108307767       System I/O                   30

          10       2396326234        Scheduler                      7

          11       3871361733        Cluster                          50

          12       644977587        Queueing                       9

1.4 相关的几个视图


V$SESSION:代表数据库活动的开始,视为源起。

V$SESSION_WAIT:视图用以实时记录活动SESSION的等待情况,是当前信息。

V$SESSION_WAIT_HISTORY:是对V$SESSION_WAIT的简单增强,记录活动SESSION的最近10次等待。

V$SQLTEXT:当数据库出现瓶颈时,通常可以从V$SESSION_WAIT找到那些正在等待资源的SESSION,

 通过SESSION的SID,联合V$SESSION和V$SQLTEXT视图就可以捕获这些SESSION正在执行的SQL语句。

V$ACTIVE_SESSION_HISTORY:是ASH的核心,用以记录活动SESSION的历史等待信息,每秒采样一次,这部分内容记录在内存中,期望


值是记录一个小时的内容。

WRH#_ACTIVE_SESSION_HISTORY: 是V$ACTIVE_SESSION_HISTORY在AWR的存储地。

V$ACTIVE_SESSION_HISTORY中 的信息会被定期(每小时一次)的刷新到负载库中,并缺省保留一个星期

 用于分析。

DBA_HIST_ACTIVE_SESS_HISTORY:视图是WRH#_ACTIVE_SESSION_HISTORY视图和其他几个视图的联合展现,通常通过这个视图进行历


史数据的访问。

V$SYSTEM_EVENT: 由于V$SESSION记录的是动态信息,和SESSION的生命周期相关,而并不记录历史信

 息,所以ORACLE提供视图V$SYSTEM_EVENT来记录数据库自启动以来所有等待事件的汇总信息。通过这个视图,用户可以迅速获得数


据库运行的总体概况。

 

1.5 等待事件相关查询

查询数据库等待时间和实际执行时间的相对百分比


select *

  from v$sysmetric a

 where a.METRIC_NAME in

       ('Database CPU Time Ratio', 'Database Wait Time Ratio')

   and a.INTSIZE_CSEC = (select max(intsize_csec) from v$sysmetric);


查询数据库中过去30分钟引起最多等待的sql语句


select ash.USER_ID,

       u.username,

       sum(ash.WAIT_TIME) ttl_wait_time,

       s.SQL_TEXT

  from v$active_session_history ash, v$sqlarea s, dba_users u

 where ash.SAMPLE_TIME between sysdate - 60 / 2880 and sysdate

   and ash.SQL_ID = s.SQL_ID

   and ash.USER_ID = u.user_id

 group by ash.USER_ID, s.SQL_TEXT, u.username

 order by ttl_wait_time desc

查询数据库中的等待事件------


select event, count(*)

  from v$session_wait

 group by event

 order by count(*) desc


--查询数据库过去15分钟最重要的等待事件


select ash.EVENT, sum(ash.WAIT_TIME + ash.TIME_WAITED) total_wait_time

  from v$active_session_history ash

 where ash.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate

 group by event

 order by total_wait_time desc

-在过去15分钟哪些用户经历了等待-----


select s.SID,

       s.USERNAME,

       sum(ash.WAIT_TIME + ash.TIME_WAITED) total_wait_time

  from v$active_session_history ash, v$session s

 where ash.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate

   and ash.SESSION_ID = s.SID

 group by s.SID, s.USERNAME

 order by total_wait_time desc;

查询等待时间最长的对象—


select a.CURRENT_OBJ#,

       d.object_name,

       d.object_type,

       a.EVENT,

       sum(a.WAIT_TIME + a.TIME_WAITED) total_wait_time

  from v$active_session_history a, dba_objects d

 where a.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate

   and a.CURRENT_OBJ# = d.object_id

 group by a.CURRENT_OBJ#, d.object_name, d.object_type, a.EVENT

 order by total_wait_time desc;

查询过去15分钟等待时间最长的sql语句

select a.USER_ID,

       u.username,

       s.SQL_TEXT,

       sum(a.WAIT_TIME + a.TIME_WAITED) total_wait_time

  from v$active_session_history a, v$sqlarea s, dba_users u

 where a.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate

   and a.SQL_ID = s.SQL_ID

   and a.USER_ID = u.user_id

 group by a.USER_ID, s.SQL_TEXT, u.username

 order by total_wait_time desc;

那些SQL消耗更多的IO-

select *

  from (select s.PARSING_SCHEMA_NAME,

               s.DIRECT_WRITES,

               substr(s.SQL_TEXT, 1, 500),

               s.DISK_READS

          from v$sql s

         order by s.DISK_READS desc)

 where rownum < 20

--

查看哪些会话正在等待IO资源


SELECT username, program, machine, sql_id

  FROM V$SESSION

 WHERE EVENT LIKE 'db file%read';

--查看正在等待IO资源的对象---

SELECT d.object_name, d.object_type, d.owner

FROM V$SESSION s, dba_objects d

WHERE EVENT LIKE 'db file%read'

  and s.ROW_WAIT_OBJ# = d.object_id


查看redo日志切换频率

Select round(FIRST_TIME, 'DD'), THREAD#, Count(SEQUENCE#)

  From v$log_history

 Group By round(FIRST_TIME, 'DD'), THREAD#

 Order By 1, 2


SELECT  trunc(first_time) "Date",

        to_char(first_time, 'Dy') "Day",

        count(1) "Total",

        SUM(decode(to_char(first_time, 'hh24'),'00',1,0)) "h0",

        SUM(decode(to_char(first_time, 'hh24'),'01',1,0)) "h1",

        SUM(decode(to_char(first_time, 'hh24'),'02',1,0)) "h2",

        SUM(decode(to_char(first_time, 'hh24'),'03',1,0)) "h3",

        SUM(decode(to_char(first_time, 'hh24'),'04',1,0)) "h4",

        SUM(decode(to_char(first_time, 'hh24'),'05',1,0)) "h5",

        SUM(decode(to_char(first_time, 'hh24'),'06',1,0)) "h6",

        SUM(decode(to_char(first_time, 'hh24'),'07',1,0)) "h7",

        SUM(decode(to_char(first_time, 'hh24'),'08',1,0)) "h8",

        SUM(decode(to_char(first_time, 'hh24'),'09',1,0)) "h9",

        SUM(decode(to_char(first_time, 'hh24'),'10',1,0)) "h10",

        SUM(decode(to_char(first_time, 'hh24'),'11',1,0)) "h11",

        SUM(decode(to_char(first_time, 'hh24'),'12',1,0)) "h12",

        SUM(decode(to_char(first_time, 'hh24'),'13',1,0)) "h13",

        SUM(decode(to_char(first_time, 'hh24'),'14',1,0)) "h14",

        SUM(decode(to_char(first_time, 'hh24'),'15',1,0)) "h15",

        SUM(decode(to_char(first_time, 'hh24'),'16',1,0)) "h16",

        SUM(decode(to_char(first_time, 'hh24'),'17',1,0)) "h17",

        SUM(decode(to_char(first_time, 'hh24'),'18',1,0)) "h18",

        SUM(decode(to_char(first_time, 'hh24'),'19',1,0)) "h19",

        SUM(decode(to_char(first_time, 'hh24'),'20',1,0)) "h20",

        SUM(decode(to_char(first_time, 'hh24'),'21',1,0)) "h21",

        SUM(decode(to_char(first_time, 'hh24'),'22',1,0)) "h22",

        SUM(decode(to_char(first_time, 'hh24'),'23',1,0)) "h23"

FROM    V$log_history

group by trunc(first_time), to_char(first_time, 'Dy')

Order by 1

 

二、33个常见的等待事件

1. Buffer busy waits

从本质上讲,这个等待事件的产生仅说明了一个会话在等待一个Buffer(数据块),但是导致这个现象的原因却有很多种。

 常见的两种是:

?          当一个会话试图修改一个数据块,但这个数据块正在被另一个会话修改时。

?          当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读取到内存中时。

Oracle 操作的最小单位是块(Block),即使你要修改一条记录,也需要对这条记录所在的这个数据块做操作。 当你对这个数据块


做修改时,其他的会话将被阻止对这个数据块上的数据做修改(即使其他用户修改的不是当前用户修改的数据),但是可以以一致


性的方式读取这个数据块(from undo)。当前的用户修改完这个数据块后,将会立即释放掉加在这个数据块上的排他锁,这样另一


个会话就可以继续修改它。修改操作是一个非常短暂的时间,这种加锁的机制我们叫Latch。

 当一个会话修改一个数据块时,是按照以下步骤来完成的:

?          以排他的方式获得这个数据块(Latch)

?          修改这个数据块。

?          释放Latch。

Buffer busy waits等待事件常见于数据库中存在热块的时候,当多个用户频繁地读取或者修改同样的数据块时,这个等待事件就会


产生。 如果等待的时间很长,我们在AWR或者statspack 报告中就可以看到。

 这个等待事件有三个参数。查看有几个参数我们可以用以下SQL:

 /* Formatted on 6/27/2011 1:06:09 PM (QP5 v5.114.809.3010) */

 SELECT  name,

          parameter1,

          parameter2,

          parameter3

  FROM  v$event_name

  WHERE  name = 'buffer busy waits';

 NAME                  PARAMETER1  PARAMETER2  PARAMETER3

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

 buffer busy waits    file#        block#      class#

  

在下面的示例中,查询的方法和这个一样,所以其他事件对参数的查询将不做过多的说明。

File#: 等待访问数据块所在的文件id号。

Blocks: 等待访问的数据块号。

ID: 在10g之前,这个值表示一个等待时间的原因,10g之后则表示等待事件的类别。

2. Buffer latch


内存中数据块的存放位置是记录在一个hash列表(cache buffer chains)当中的。当一个会话需要访问某个数据块时,它首先要搜


索这个hash 列表,从列表中获得数据块的地址,然后通过这个地址去访问需要的数据块,这个列表Oracle会使用一个latch来保护


它的完整性。 当一个会话需要访问这个列表时,需要获取一个Latch,只有这样,才能保证这个列表在这个会话的浏览当中不会发


生变化。

 产生buffer latch的等待事件的主要原因是:

?          Buffer chains太长,导致会话搜索这个列表花费的时间太长,使其他的会话处于等待状态。

?          同样的数据块被频繁访问,就是我们通常说的热快问题。

 产生buffer chains太长,我们可以使用多个buffer pool的方式来创建更多的buffer chains,或者使用参数


DB_BLOCK_LRU_LATCHES来增加latch的数量,以便于更多的会话可以获得latch,这两种方法可以同时使用。

 这个等待事件有两个参数:

Latch addr: 会话申请的latch在SGA中的虚拟地址。

 通过以下的SQL语句可以根据这个地址找到它对应的Latch名称:

/* Formatted on 6/27/2011 1:12:48 PM (QP5 v5.114.809.3010) */

 select * from v$latch a,v$latchname b where

 addr=latch addr -- 这里的latch addr 是你从等待事件中看到的值 

and a.latch#=b.latch#;

 chain#: buffer chains hash 列表中的索引值,当这个参数的值等于s 0xfffffff时,说明当前的会话正在等待一个LRU latch。

3. Control file parallel write


当数据库中有多个控制文件的拷贝时,Oracle 需要保证信息同步地写到各个控制文件当中,这是一个并行的物理操作过程,因为称


为控制文件并行写,当发生这样的操作时,就会产生control file parallel write等待事件。

 控制文件频繁写入的原因很多,比如:

?          日志太过频繁,导致控制文件信息相应地需要频繁更新。

?          系统I/O 出现瓶颈,导致所有I/O出现等待。

 当系统出现日志切换过于频繁的情形时,可以考虑适当地增大日志文件的大小来降低日志切换频率。

 当系统出现大量的control file parallel write 等待事件时,可以通过比如降低控制文件的拷贝数量,将控制文件的拷贝存放在


不同的物理磁盘上的方式来缓解I/O 争用。

 这个等待事件包含三个参数:

Files: Oracle 要写入的控制文件个数。

Blocks: 写入控制文件的数据块数目。

Requests: 写入控制请求的I/O 次数。

4. Control file sequential read


当数据库需要读取控制文件上的信息时,会出现这个等待事件,因为控制文件的信息是顺序写的,所以读取的时候也是顺序的,因


此称为控制文件顺序读,它经常发生在以下情况:

 备份控制文件

RAC 环境下不同实例之间控制文件的信息共享

 读取控制文件的文件头信息

 读取控制文件其他信息

 这个等待事件有三个参数:

File#: 要读取信息的控制文件的文件号。

Block#: 读取控制文件信息的起始数据块号。

Blocks: 需要读取的控制文件数据块数目。

 5. Db file parallel read


这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行DML)没有关系。 这个事件发生在数


据库恢复的时候,当有一些数据块需要恢复的时候,Oracle会以并行的方式把他们从数据文件中读入到内存中进行恢复操作。

 这个等待事件包含三个参数:

Files: 操作需要读取的文件个数。

Blocks: 操作需要读取的数据块个数。

Requests: 操作需要执行的I/O次数。

 6. Db file parallel write


这是一个后台等待事件,它同样和用户的并行操作没有关系,它是由后台进程DBWR产生的,当后台进程DBWR向磁盘上写入脏数据时


,会发生这个等待。

DBWR会批量地将脏数据并行地写入到磁盘上相应的数据文件中,在这个批次作业完成之前,DBWR将出现这个等待事件。如果仅仅是


这一个等待事件,对用户的操作并没有太大的影响,当伴随着出现free buffer waits等待事件时,说明此时内存中可用的空间不足


,这时候会影响到用户的操作,比如影响到用户将脏数据块读入到内存中。

 当出现db file parallel write等待事件时,可以通过启用操作系统的异步I/O的方式来缓解这个等待。当使用异步I/O时,DBWR不


再需要一直等到所有数据块全部写入到磁盘上,它只需要等到这个数据写入到一个百分比之后,就可以继续进行后续的操作。

 这个等待事件有两个参数:

Requests: 操作需要执行的I/O次数。

Timeouts: 等待的超时时间。

 7. Db file scattered read

这个等待事件在实际生产库中经常可以看到,这是一个用户操作引起的等待事件,当用户发出每次I/O需要读取多个数据块这样的


SQL 操作时,会产生这个等待事件,最常见的两种情况是全表扫描(FTS: Full Table Scan)和索引快速扫描(IFFS: index 


fast full scan)。

 这个名称中的scattered( 分散),可能会导致很多人认为它是以scattered 的方式来读取数据块的,其实恰恰相反,当发生这种等


待事件时,SQL的操作都是顺序地读取数据块的,比如FTS或者IFFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。

 这里的scattered指的是读取的数据块在内存中的存放方式,他们被读取到内存中后,是以分散的方式存在在内存中,而不是连续


的。

 这个等待事件有三个参数:

File#: 要读取的数据块所在数据文件的文件号。

Block#: 要读取的起始数据块号。

Blocks: 需要读取的数据块数目。





如有疑问 请留言 欢迎提供建议

评论已有 0