`
itspace
  • 浏览: 981752 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从Oracle 隐含参数_db_block_max_cr_dba引伸开去

阅读更多
今天偶尔看到一个隐含参数_db_block_max_cr_dba,Oracle对它的解释是 Maximum Allowed Number of CR buffers per dba其默认值是6。
尽管是周末,一时手痒对其做一把测试,看看究竟是干嘛用的。                         

数据库版本为
SQL>  select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod

创建一张测试表
SQL> conn zhou/zhou
Connected.
SQL> create table testcr as select

SQL> create table testcr (id number);

Table created.

获得测试表testcr的file和block
SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_id,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block_no from testcr;

   FILE_ID   BLOCK_NO
---------- ----------
         7      39213
        
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1

现在会话一执行update不提交
SQL> update testcr set id=2;

1 row updated.

会话二执行


SQL> select * from testcr;

        ID
----------
         1

会话一查看内存中该block的情况
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
cr               3

在会话二多次查询该表格,继续在会话一查看内存中该block的情况,发现xcur+cr刚好等于6即隐含参数_db_block_max_cr_dba值
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
cr               5

如果在会话一查询

SQL> select * from testcr;

        ID
----------
         2
        
可以发现cr从5变为4,将会话二的cr版本置换出去
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
cr               4

先将事务回滚
SQL> rollback;

Rollback complete.

SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
cr               4

如果将内存刷出会发生什么事情呢
SQL> alter system flush buffer_cache;

System altered.
可以看到cr 状态变为free。
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
free             4

再次在会话一中查询,可以看到产生一个xcur块。
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
free             4

SQL> select * from testcr;

        ID
----------
         1

SQL>  select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
free             4

SQL> update testcr set id=5;

1 row updated.

SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
free             4
cr               1

如果在会话二执行数次查询testcr表,再在会话一中查询
SQL> /

STATUS    COUNT(*)
------- ----------
xcur             1
free             4
cr               5

经过以上测试我们可以得到以下结论:
1、 隐含参数 _db_block_max_cr_dba为xcur+cr的值,并不是Oracle所说的cr在buffer cache的最大数量。
2、数据块第一次进入buffer cache的模式为xcur模式
3、update一张表格,即使这张表格在内存中,也会触发cr读,这个结论可以从10046中得到再次验证。
实验如下:
SQL> alter system flush buffer_cache;

System altered.

SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
free            11

SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';

Session altered.

SQL> update testcr set id=8;

1 row updated.

SQL> alter session set events '10046 trace name context off';

Session altered.

SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
free            11
cr               1

[ora10g@mcprod udump]$ tkprof  mcstar_ora_21794.trc testcr.trc sys=no

********************************************************************************

update testcr set id=8


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          1          1          0           0
Execute      1      0.00       0.00          1          7          2           1
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          2          8          2           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 64 

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  UPDATE  TESTCR (cr=7 pr=1 pw=0 time=208 us)
      1   TABLE ACCESS FULL TESTCR (cr=7 pr=0 pw=0 time=29 us)



这里我们不禁有个疑问为什么会产生7个cr读呢?注意到执行计划TABLE ACCESS FULL TESTCR,它会扫描高水位以下的所有block(本例中segment 头除外)


SQL> select BLOCK_ID,BLOCKS from dba_extents where OWNER='ZHOU' and SEGMENT_NAME='TESTCR';

  BLOCK_ID     BLOCKS
---------- ----------
     39209          8

SQL> select status,count(*) from v$bh where file#=7 and block#=39212 group by status;

STATUS    COUNT(*)
------- ----------
xcur             1
free             1

SQL> alter system flush  buffer_cache;

System altered.

SQL> alter session set db_file_multiblock_read_count=1;

Session altered.

SQL> alter session set events '10200 trace name context forever, level 1';

Session altered.

SQL>  ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';

Session altered.

SQL> update testcr set id=9;

1 row updated.

[ora10g@mcprod udump]$ cat mcstar_ora_21794.trc|grep "Consistent read started"
Consistent read started for block 7 : 01c0992c
Consistent read started for block 7 : 01c0992d
Consistent read started for block 7 : 01c0992e
Consistent read started for block 7 : 01c0992f
Consistent read started for block 7 : 01c09930
Consistent read started for block 7 : 01c0992c
Consistent read started for block 7 : 01c0992d
Consistent read started for block 7 : 01c0992e
Consistent read started for block 7 : 01c0992f
Consistent read started for block 7 : 01c09930

注意到业务块从39212开始,因为前面几个块是segment头和位图块。
SQL> /
Enter value for 1: 01c0992c
old   1: select getbfno('&1') BFNO from dual
new   1: select getbfno('01c0992c') BFNO from dual

BFNO
------------------------------------------------------------
datafile# is:7
datablock is:39212
dump command:alter system dump datafile 7 block 39212;




分享到:
评论

相关推荐

    oracle_dba_code_examples201012.pdf

    o Make Oracle_HOME $ORACLE_BASE/product/version/{db|client|companion}_[n]. Examples: /u01/app/oracle/product/11.1.0/db_1 /u01/app/oracle/product/11.1.0/client_1 /u01/app/oracle/product/10.1.0.2.0/db_1...

    oracle DBA_TAB_MODIFICATIONS 刷新

    总结来说,Oracle DBA_TAB_MODIFICATIONS 视图是数据库变更跟踪的重要工具,但它的行为取决于多种因素,包括操作类型(如 `CREATE TABLE AS` 或 `APPEND` 指令)、事务提交状态、隐含参数设置以及刷新机制。...

    ORACLE_审计内容_DBA_AUDIT_TRAIL.xlsx

    Oracle审计内容DBA_AUDIT_TRAIL数据字典说明,根据开启的Oracle审计功能,读取dba_audit_trail视图的审计内容包含用户名、操作时间、操作类型、SQL文本、数据库操作次数等等,此文档是对dba_audit_trail视图的中文简介,...

    Oracle-dba.zip_Oracle-dba_dba_oracle_oracle dba_oracle 管理

    Oracle数据库管理员(DBA)是IT领域中的关键角色,负责维护和优化Oracle数据库系统,确保数据的安全性、可用性和性能。本压缩包“Oracle-dba.zip”提供了丰富的Oracle DBA相关资源,尤其对DBA新手而言,是一份极具...

    详解Oracle数据库的db_cache_size和granule_size

    - `DB_CACHE_SIZE`用于指定数据库中DEFAULT缓冲池的大小,这个缓冲池主要用来存储具有主块大小(由`DB_BLOCK_SIZE`初始化参数定义)的数据块。 - 数据块在被数据库读取后会被放置在内存缓冲区中,而`DB_CACHE_SIZE`...

    DBA指南+10G备份与恢复+Oracle_DBA_数据库日常维护手册_常用SQL_脚本

    Oracle DBA指南+10G备份与恢复+Oracle_DBA_数据库日常维护手册_常用SQL_脚本

    oracle_10203_vista_w2k8_x86_production_db.zip

    oracle_10203_vista_w2k8_x86_production_db

    oracle_db_11

    oracle_db_10

    数据库oracle rac 修改db_unique_name参数

    Oracle RAC 修改 db_unique_name 参数 在 Oracle RAC 环境中,db_unique_name 参数是一个非常重要的参数,它决定了数据库的唯一标识。在某些情况下,我们需要修改 db_unique_name 参数,以便满足特定的需求。本文将...

    oracle_db_07 安装包

    oracle_db_07 安装包

    oracle_DBA.rar_dba_dsi401_oracle dba_oracle internal_oracle 培训

    DSI401是Oracle提供的一个专业课程,专注于DBA的工作内容,而"oracle_internal"则指的是Oracle数据库的内部工作原理。Oracle培训旨在提升技术人员对Oracle数据库的深入理解和操作技能。以下是基于这些关键词的Oracle...

    详解Oracle中的隐含参数_disable_logging

    从Oracle的系统表中,我们知道Oracle存在一个隐含参数_disable_logging可以用于禁用日志生成,这个参数显然只能用于测试目的(可以极大提高Benchmark测试的性能),禁止日志生成必然导致事务的不可恢复性,而且会导致...

    Oracle_instant_client_10_2

    2、在oracle安装路径(C:\oracle\product\10.2.0\db_1\network\ADMIN)中找tnsnames.ora 复制到C:\Oracle_instant_client_10_2路径下 3、第一次启动plsql,点击取消 设置oracle目录名为C:\Oracle_instant_client_10_2 ...

    Oracle_DBA突击__帮你赢得一份DBA职位

    Oracle_DBA突击__帮你赢得一份DBA职位

    Oracle10g安装包:Oracle10g_vista_w2k8_x86_production_db.zip

    Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性...

    Oracle Database 19c (LINUX.X64_193000_db_home.part3.rar)

    Oracle Database 19c 是最新的长期版本,支持期限最长;19.3 - 企业版(也包括标准版 2) 适用于LINUX X64位系统。 LINUX.X64_193000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: ...

    Oracle Database 21c (WINDOWS.X64_213000_db_home.part3.rar)

    Oracle Database 21c 是最新的版本; 21.3 - 企业版(也包括标准版 2) 适用于WINDOWS X64系统。WINDOWS.X64_213000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle ...

    Oracle Database 21c (WINDOWS.X64_213000_db_home.part1.rar)

    Oracle Database 21c 是最新的版本; 21.3 - 企业版(也包括标准版 2) 适用于WINDOWS X64系统。WINDOWS.X64_213000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle ...

    BLOG_Oracle_lhr_RAC 12cR1安装.pdf

    BLOG_Oracle_lhr_RAC 12cR1安装.pdfBLOG_Oracle_lhr_RAC 12cR1安装.pdf

    Oracle_DBA_职业要求.txt

    Oracle_DBA_职业要求: 看似简单的“保障数据库系统的正常运行”实现起来却要解决一系列的问题: 保障数据库性能:保障用户快速地存取数据 保障数据安全:不被非法盗用 保障可靠的数据备份:在存储系统出现故障时...

Global site tag (gtag.js) - Google Analytics