zoukankan      html  css  js  c++  java
  • 相克军_Oracle体系_随堂笔记005-Database buffer cache

    本章主要阐述SGA中的Database buffer cache。
    Buffer cache {
    1.pin (读写瞬间的状态)
    2.clean
    3.dirty
    4.unused
    }
    --Database buffer cache
    概述:
    1.段、区、块的概念:
    create table t2 (
        id int,
        name varchar2(30)
    );
    建立一个表,同时建立一个段,
    建立段的同时,会给段分配一个区,
    区是物理上连续的几个块。
    区是oracle给段分配的最小单位。
    块是oracle I/O的最小单位。
    insert into t2 values(1,'xiaobei');
    访问:
    访问一个块,
    一般情况下,一个块中有多个行(行链接,行迁移除外)。
    2.buffer cache的意义:
    ①减少I/O:物理I/O,逻辑I/O
    ②构造cr块
     
    引入undo:Oracle在修改数据以前,会将数据写到undo中。
    undo的作用{
    回滚未提交事物;
    构造cr块。
    }
    这里会引出两个更深入的问题:①会话2如何知道会话1没有提交?②cr块如何从undo空间中找到被删除的那一行。
     
    3.buffer cache的内存组织结构
    CBC、LRU、LRUW、CHECKPOINT QUEUE
    CBC    按照块地址将buffer链起来。
    LRU    最近最少使用的顺序链起来。可用块~
        LRU,MRU(最近最多使用)
    LRUW    脏块的,DBWn以此为标准优先写最近最少使用的脏块。
    CHECKPOINT QUEUE    也是关于脏块的,按块第一次脏的时间点链起来。
    注:在Oracle中,一般都是采用双向的链。
     
    4.DB_WRITER_PROCESSES
    SQL> show parameter writer
     
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_writer_processes                  integer     1
    SQL> alter system set db_writer_processes = 2 scope=spfile;
    --DBWn数量一般设定是服务器核心数/8.
     
    5.buffer cache的重要参数配置
    alter system set db_cache_size=200m scope=both;
    设置顺序:
    sga_max_size
    sga_target
    db_cache_size
    在OLTP系统中,buffer cache的大小一般设置为sga_max_size的2/3.
    DB_CACHE_SIZE = SGA_MAX_SIZE/2 ~ SGA_MAX_SIZE*2/3
    使用advice来确认buffer cache的大小
    根据语句查询buffer cache该设置多大合适。减少I/O(物理读次数)
    平日注意收集积累一些常用的语句》。
    
     
    6.Block状态
    buffer header:
    SQL> desc x$bh    
     
    state:0~8
    0,free
    1,XCUR
    2,SCUR
    3,CR
    4,READ    从block写入buffer的那个过程
    5,MREC
    6,IREC
    7,write
    8,pi
     
    SQL> select distinct state from x$bh;
    非RAC环境下,current永远等于xcur。
    RAC下,有scur
    
     
    Q:current块和cr块区别?
    A:
    cr块被构造后被读出,就马上没意义了。。马上就可以被覆盖了。。
    要修改一个块,只能修改current块。
    

    Q:查看一个对象占用了多少不同状态的buffer?

    A:
    select
    o.object_name,
    decode(state,0,'free',1,'xcur',2,'scur',3,'cr',4,'read',5,'mrec',
    6,'irec',7,'write',8,'pi') state,
    count(*) blocks
    from x$bh b, dba_objects o
    where b.obj = o.data_object_id
    and o.object_name = 'T2'
    group by o.object_name, state
    order by blocks desc
    
    注:实验的时候可以先执行
    alter system flush buffer_cache;
    
     
    7.使用各种sql熟知buffer cache使用情况
    select distinct object_name, dbarfil, dbablk from x$bh a, dba_objects b
    where a.obj=b.object_id and object_name='T2';
    
    OBJECT_NAME             DBARFIL     DBABLK
    -------------------- ---------- ----------
    T2                            1      86184
    T2                            1      86185
    select object_name, dbarfil, dbablk from x$bh a, dba_objects b
    where a.obj=b.object_id and object_name='T2';
    
    Q:将buffer cache中占用buffer最多的对象给找出来?
    A:
    select
    o.object_name,
    decode(state,0,'free',1,'xcur',2,'scur',3,'cr',4,'read',5,'mrec',
    6,'irec',7,'write',8,'pi') state,
    count(*) blocks
    from x$bh b, dba_objects o
    where b.obj = o.data_object_id and state<>0
    group by o.object_name, state
    order by blocks asc;
    
    Q:寻找热块
    A:
    select 
    obj object,
    dbarfil file#,
    dbablk block#,
    tch touches
    from x$bh
    where tch>10 
    order by
    tch asc;
    
        OBJECT      FILE#     BLOCK#    TOUCHES
    ---------- ---------- ---------- ----------
          5847          1      11752         29
          5834          1      11664         29
          5834          1      11665         29
          5832          1      11649         30
          5833          1      11657         30
          5834          1      11666         31
           287          1       2009         45
           287          1       2008         45
     
    96 rows selected.
    注:块被逻辑读的次数多,就是热端,根据块的tch属性判断。
    select object_name, dbarfil, dbablk from x$bh a, dba_objects b
    where a.obj=b.object_id and dbarfil=1 and dbablk=287
    
    Q:块的总数
    A:
    select sum(blocks) from dba_data_files;
    
    SUM(BLOCKS)
    -----------
         176640
     
    Q:查询当前空闲空间的比例,最好控制在10%以内
    A:
    select decode(state,0,'FREE',1,decode(lrba_seq,0,'AVAILABLE','BEING USED'),3,'BEING USED', state) "BLOCK STATUS",count(*) 
    from x$bh
    group by decode(state,0,'FREE',1,decode(lrba_seq,0,'AVAILABLE','BEING USED'),3,'BEING USED',state);
    

    BLOCK STATUS                               COUNT(*)

    ---------------------------------------- ----------
    BEING USED                                       74
    AVAILABLE                                      5385
    FREE                                          10696
    Q:最浪费内存的前10个语句占所有的比例,建议控制在5%以内
    A:
    select sum(pct_bufgets) "Percent" 
    from (select rank() over (order by buffer_gets desc) as rank_bufgets, to_char(100 * ratio_to_report(buffer_gets) over(),'999.99')pct_bufgets from v$sqlarea) 
    where rank_bufgets < 11;
    
    Q:找出消耗物理I/O资源最大的SQL语句
    A:
    select disk_reads, substr(sql_text,1,4000) 
    from v$sqlarea 
    order by disk_reads asc;
    
    Q:常见的操作系统命令,查看
    A:
    iostat 1 10
    vmstat 1 10
    mpstat 1 10
    mpstat -P 0 1
    mpstat -P 1 1
    top
    free
    
    内存读:消耗CPU资源
    物理读:消耗I/O资源
  • 相关阅读:
    【CF 359B】Permutation
    如何更新 DevC++ 的编译器
    【LG 2801】教主的魔法
    矩阵浅谈
    NOI 系列赛常见技术问题整理
    Treap 浅谈
    DP 优化浅谈
    友链
    【CF 708C】Centroids
    我跳过的坑
  • 原文地址:https://www.cnblogs.com/jyzhao/p/3819369.html
Copyright © 2011-2022 走看看