oracle等待事件1——高速缓冲内cbc latch

恩。。从今天起,木木同学要认真整理一下oracle中常见的等待事件,通过这部分的学习,希望自己能对oracle内部的结构能有一个更清晰的认识,有兴趣的童鞋一起来哇。。。


1、latch:cache buffers chains

从oracle 9i开始,以只读为目的的查询chains时,可以将cache buffers chains锁存器以shared模式共享,因此有助于减少争用。

(我们需要注意,若能共享cache buffer chains 锁存器,理论上理论上不应该发生同时执行select 操作引起cbc锁存器的争用,但实际的测试结果表明,同时执行select依然会发生cbc锁存器争用,其理由是与buffer lock相关:为了读取工作,以shared模式已经获得锁存器,但是读取实际缓冲区过程中,还要以shared 模式获取buffer lock,在此过程真呢过需要部分修改缓冲区头信息。因此在获取buffer lock过程中,需要将cbc锁存器修改为exclusive 模式,在释放buffer
lock期间也需要exclusive模式获取cbc锁存器,在此过程中会发生争用。)

发生cache buffers chains 锁存器争用代表性的情况如下:低效的SQL    和     hot block(热块)

低效SQL引起的cbc争用

先介绍视图:v$latch_children 

数据库中有些类别的latches拥有多个。v$latch中提供了每个类别的总计信息。如果想查看单个latch,可以通过查询本视图:

查询数据库中所有latch的名字和个数:SQL> select name,count(*) ct from v$latch_children group by name order by ct desc;

NAME                                                                             CT
----------------------------------------                               ----------
cache buffers chains                                               1024
SQL memory manager workarea list latch           67
channel operations parent latch                            65
global tx hash mapping                                           47
message pool operations parent latch               34
name-service namespace bucket                         32
simulator hash latch                                             32
row cache objects                                                  29
redo allocation                                                        20
In memory undo latch                                           18
checkpoint queue latch                                         16

NAME                                                              CT
----------------------------------------               ----------
msg queue                                                  15
JS queue access latch                             13
commit callback allocation                       11
transaction allocation                              11
buffer pool                                                 8
cursor bind value capture                         8
simulator lru latch                                      8
object queue header operation                8
object queue header heap                        8
cache buffers lru chain                               8
business card                                             8

NAME                                                      CT
----------------------------------------        ----------
shared pool                                             7
flashback copy                                       6
virtual circuit queues                            6
post/wait queue                                    5
slave class                                             5
JS slv state obj latch                            4
redo copy                                                4
session switching                                 4
parallel query alloc buffer                       4
job workq parent latch                            3
undo global data                                  3

     
NAME                                                     CT
---------------------------------------       -----------
library cache pin allocation                      3
library cache pin                                      3
library cache hash chains                   3
peplm                                                     3
library cache lock                                 3
library cache lock allocation                 3
library cache                                           3
Shared B-Tree                                     2
session idle bit                                     2
parallel query stats                              2
longop free list parent                           2

NAME                                                   CT
----------------------------------------       ----------
latch wait list                                        2
ksfv messages                                     2
enqueue hash chains                          2

client/application info                           2
channel handle pool latch                    1
granule operation                                 1
logminer context allocation                   1
session queue latch                           1
sim partition latch                                 1
msg queue latch                                   1
done queue latch                                  1

已选择55行。

如此说来,oracle10g中有55个有名字的latch,拥有量最大的就是我们的cbc latch,正好1024个。

我通过构建测试环境,创建了表,加上索引。并且创建一个全表扫描的过程:

SQL> create table  cbc_test(id number, name char(100));

SQL> insert into cbc_test(id,name) select object_id, object_name from dba_objects;

SQL> cretate index cbc_test_idx on cbc_test(id);

好了,下面进行不必要的广泛扫描索引:创建一个过程:

create or replace procedure cbc_do_select is 
  begin
    for x in(select /*+index(cbc_test cbc_test_idx)*/ * 
    from cbc_test where id>=0) loop
     null;
    end loop;
  end;

反复执行此过程2000次:

var job_no number;
  begin 
   for idx in 1..2000 loop
     dbms_job.submit(:job_no,'cbc_do_select;');
     commit;
   end loop;
 end;

查看一下cbc 锁存器对应的CHILD#,GETS, SLEEPS判断子锁存器上使用的次数和争用是否集中:

select * from
  2   (select child#,name,gets,sleeps from v$latch_children
  3     where name='cache buffers chains'
  4     order by sleeps desc
  5    )where rownum<=20;

    CHILD# NAME                                 GETS     SLEEPS
---------- ------------------------------ ---------- ----------
       837 cache buffers chains                34466         28
        67 cache buffers chains                23994         15
       684 cache buffers chains                 6288         14
       238 cache buffers chains                 3823         12
       898 cache buffers chains                 4868         12
       908 cache buffers chains                32807         10
       288 cache buffers chains                 3956          8
       737 cache buffers chains                 3865          8
       412 cache buffers chains                 1671          8
       968 cache buffers chains                 2706          7
       420 cache buffers chains                 2998          6

    CHILD# NAME                                 GETS     SLEEPS
---------- ------------------------------ ---------- ----------
       460 cache buffers chains                 3912          6
         1 cache buffers chains                 2564          4
       839 cache buffers chains                 1119          4
       951 cache buffers chains                21741          4
        33 cache buffers chains                 3786          3
       251 cache buffers chains                 1997          2
       578 cache buffers chains                 3857          2
       733 cache buffers chains                 3554          2
       280 cache buffers chains                 4549          2

已选择20行。

看来837号cbc 子锁存器争用比较多,可以判定是比较热的块。

我们也可以通过v$latch_children视图,确定热块的cbc 锁存器的地址

SQL> select * from
  2   (select latch#,child#,addr,gets,sleeps from v$latch_children
  3     where name='cache buffers chains'
  4     order by sleeps desc
  5    )where rownum<=20;

    LATCH#     CHILD# ADDR           GETS     SLEEPS
---------- ---------- -------- ---------- ----------
       116        894 6CB7F7F0     554344         90
       116        837 6CFFF70C     727379         80
       116        951 6CB839D8     471117         74
       116         56 6C783224     107910         60
       116        341 6C797BAC     144056         47
       116        458 6C7A02F4      37434         38
       116        240 6C7906E4      99251         37
       116        297 6C7948CC      98903         36
       116        566 6C7A7FD4      94932         36
       116        790 6CFFC0B4     107997         36
       116        280 6C793524      87455         34

    LATCH#     CHILD# ADDR           GETS     SLEEPS
---------- ---------- -------- ---------- ----------
       116        919 6CB814D8      49667         31
       116        583 6C7A937C      85883         29
       116        113 6C78740C     120322         28
       116        627 6C7AC65C      91840         28
       116        534 6C7A5AD4     112523         27
       116        270 6C792994      50302         26
       116        418 6C79D4B4      37697         26
       116        680 6C7B03A4     104550         26
       116        676 6C7AFF04     103297         26

已选择20行。

通过上面红色的锁存器地址,结合x$bh 视图,查看tch的次数,确定热快:

SQL> select hladdr,obj,(select object_name from dba_objects
  2            where (data_object_id is null and object_id=x.obj)
  3            or data_object_id=x.obj
  4            and rownum=1 )as object_name,dbarfil,dbablk,tch
  5            from x$bh x
  6          where hladdr in('6CB7F7F0','6CFFF70C')
  7      order by hladdr,obj;

HLADDR          OBJ             OBJECT_NAME      DBARFIL     DBABLK        TCH
--------                ----------          -------------              ----------       ----------          ----------
6CB7F7F0         18                 OBJ$                          1             47810          0
6CB7F7F0        109              I_SYSAUTH1             1               827            15
6CB7F7F0      57855           CBC_TEST                1             58171           0
6CB7F7F0      57855           CBC_TEST               1              58655           0
6CFFF70C          2                ICOL$                         1             42272          17
6CFFF70C         18              OBJ$                           1              47811           0
6CFFF70C        109             I_SYSAUTH1             1             828               15
6CFFF70C      57855           CBC_TEST               1             58172           0
6CFFF70C      57855           CBC_TEST               1             58656           0

但是很不幸,我这里也没有出现热块的迹象,因为tch竟然都是0.我也不知咋回事。。

时间: 2024-10-21 08:10:32

oracle等待事件1——高速缓冲内cbc latch的相关文章

oracle等待事件2——高速缓冲内等待事件

1.cache buffers lru chain 要想查看或修改工作组(LRU+LRUW)进程,始终要持有管理相应工作组的cache buffers lru chain 锁存器,若在此过程中发生争用,则要等待:latch:cache buffers lru chain 事件. 在下面两类情况下我们必须首先获得cache buffers lru chain锁存器: (1)进程想要读取还没有装载到内存上的块时,通过查询LRU列分配到所需空闲缓冲区,再次过程中需要cache buffers lru

oracle等待事件3——高速缓冲内enq锁

6. enq:TC-contention 在手动执行检查点操作中,一部分需要获得TC锁(thread checkpointlock 或 tablespace checkpointlock )在获得TC锁过程中,若发生争用,则需要等待enq:TC-contention 事件.事实上获得TC锁的过程稍微复杂. 1) 服务器进程首先以X模式获得TC锁 2) 服务器进程将已获得的TC锁变更为SSX模式.同时,CKPT进程以SS模式获得该锁.CKPT获得锁后执行检查点操作. 3) 服务器欲重新以X模式获得

Oracle 等待事件 一

以前一直想整理一下关于Oracle 的等待事件,总是没时间.现在觉得应该着手做了,其中的一些知识来自于自己的一点研究,如有错误,望大家指正..... 一 Oracle等待事件主要有两类事件: 1 空闲等待  空闲等待意味着Oracle正在等待某种动作的发生,实际上并不是因为繁忙而等待,而是因为没有事情做所以等待,如:smon timer,SMON进程的一些操作时每隔一段实际循环执行的,即使系统不忙,此事件也不立即发生,而是等待计时器达到一定的时间才执行,此时出现的smon timer 等待事件,

oracle等待事件10——I/O上的等待事件 下篇

5.direct path read temp / direct path write temp 为了排序工作在临时区域读写时,等待direct path read temp.direct path write temp事件.这个等待时间是从10g开始被分类的.9i之前是通过direct path read .direct path write 等特观察的.排序段上的direct path I/O是在需要排序的数据比为排序所分配的PGA内存区大时发生的.因此若排序工作时大量发生direct pa

oracle等待事件9——I/O上的等待事件 上篇

1.db file scattered read oracle在执行全表扫描(FTS:full table scan)或全索引扫描(index full scan)时,为保障性能,尽量一次性读取多个块,这称为Multi Block I/O.每次执行multi block I/O,都会等待物理I/O结束,此时等待db file scattered read 事件.利用db file scattered read等待事件的P1=file#,P2=初始block#,P3=要读取的块数的信息,可以确认哪

oracle等待事件6——行高速缓存上的等待事件

1.row cache lock oracle将数据子典信息存于SGA内的行高速缓冲区(或dictionary cache),行高速缓冲区位于共享池内,可以通过如下命令进行确认: SQL> select pool,name,bytes from v$sgastat where name='row cache'; POOL          NAME                                          BYTES ------------ --------------

oracle等待事件5——库高速缓存上的等待事件 中

3.library cache lock 和 library cache pin library cache lock 的定义:访问或修改库高速缓冲区的对象时,对库高速缓冲区句柄(handle)获得的锁,在获得library cache lock 的过程中,如果发生争用,则等待library cache lock事件. 通过library cache lock 事件的P1=handle address  P2=lock address  P3=mode*100+namespace,可以掌握对哪个

oracle等待事件11——重做缓冲区上的等待事件

1.latch:redo writing  , latch :redo allocation  ,latch:redo copy oracle 为了保护将重做记录复制到重做缓冲区的一连串过程,使用以下三个锁存器: 1)rodo writing 锁存器:为了占有重做缓冲区内的空间,向LGWR请求写入工作的进程需要获得redo writing锁存器.因为LGWR的写入工作不能同时执行,所以自然在整个实例上只有一个.redo writing锁存器是因为独立锁存器,所以可以通过v$latch_paren

oracle等待事件7——事务上的等待事件

1.enq:TM-contention 执行DML期间,为防止对DML相关的对象进行修改,执行DML的进程必须对该表获得TM锁,若获得TM锁的过程发生争用,则等待enq:TM-contention事件. TM锁其用途十分明确,但是准确的概念及定义方面有容易混淆的一面.oracle的手册上关于锁的分类说明如下: DML锁:Date lock.执行DML时保护数据的锁.Row Lock(TX)保护特定行,Table Lock(TM)保护整个表,可以通过dba_kml_locks观察. DDL锁:Da