consistent gets暴涨的一种情况

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 以前遇到过由于DELETE导致INSERT逻辑读暴涨,今天又发现了一个逻辑读暴涨的情况

 

session 1

session 2

 

SQL> SELECT /*+rowid(a)*/* FROM ctais2.test a WHERE ROWID=dbms_rowid.rowid_create(1,6388,6,13,2);

 

        ID NAME

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

         2 aa

 

 

Statistics

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

          0  recursive calls

          0  db block gets

          1  consistent gets

          0  physical reads

          0  redo size

        455  bytes sent via SQL*Net to client

        503  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

SQL> select rowid from test where id=10;

 

ROWID

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

AAABj0AAGAAAAANAAK

 

SQL> delete from test where id=1;

 

1 row deleted.

 

 

SQL> set autotrace on stat

SQL> select * from test where rowid='AAABj0AAGAAAAANAAK';

 

        ID NAME

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

        10 aa

 

 

Statistics

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

          0  recursive calls

          0  db block gets

          3  consistent gets

          0  physical reads

         52  redo size

        455  bytes sent via SQL*Net to client

        503  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

SQL> delete from test where id=2;

 

1 row deleted.

 

 

SQL> /

 

        ID NAME

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

        10 aa

 

 

Statistics

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

          0  recursive calls

          0  db block gets

          4  consistent gets

          0  physical reads

         52  redo size

        455  bytes sent via SQL*Net to client

        503  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

SQL> delete test;

 

998 rows deleted.

 

 

SQL> /

 

        ID NAME

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

        10 aa

 

 

Statistics

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

          0  recursive calls

          0  db block gets

        616  consistent gets

          0  physical reads

         52  redo size

        455  bytes sent via SQL*Net to client

        503  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

 

SQL> SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) FILE#,

  2         DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK#,

  3         COUNT(*)

  4    FROM TEST

  5   GROUP BY DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID),

  6       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID);

 

     FILE#     BLOCK#   COUNT(*)

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

         6         13        614

         6         14        386

 

上面的实验可以看出,语句的consistent gets一般等于 undo record + 2

尝试过DUMP UNDO来看,一个REDO块中包含大概30条这个块的undo record

尝试加大arraysizeconsistent gets不变

设置Event 10201 - Dump Consistent Read Undo Application,可以看到ORACLE是一条一条的应用UNDO记录

设置Event 10200 - Dump Consistent Reads buffer trace,没有跟踪出ORACLE到底对那个块读了那么多次

 

很困惑ORACLE到底读那个块读了那么多,熊哥用OraTracer看了下,发现基本是在读取undo块。我装的win7 x64,跑OraTracer要死……怨念

 

以前看TOP,书上有这么一段话:

For every SQL statement, the database engine has to guarantee the consistency of the processed

data. For that purpose, based on current blocks and undo information, consistent copies of

blocks might be created at runtime. To execute such an operation, several logical reads are

performed. Therefore, the number of logical reads performed by a SQL statement is strongly

dependent on the number of blocks that have to be reconstructed.

 

一直以为一致性读很大程度上依赖于需要重构的一致性块,今天研究undo的时候,意外的发现,其实一致性读很大程度上依赖于undo record的记录数

 

以前在ORACLE ERP上捕获到一系列异常的SQL,这些SQL访问的表,会以一定的间隔时间,大批量的DELETE数据,在INSERT数据进去。SP报告中平均每次逻辑读高达2000多,但是我测试的时候发现逻辑读只有30多,调查了v$sql_plan中的信息,发现执行计划也没什么不同,列分布也没有不均匀,当时这些SQL还不算TOP SQL,也就没怎么研究,现在想想,可能是一致性读的问题

 

如何弱化这个问题?应该首先考虑避免大事务,分阶段提交;如果是在高并发的系统中,可以考虑使用更小的块大小,减少每个块中的行数,避免有些走索引,访问很少数据块的语句也产生很高的逻辑读

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8242091/viewspace-671343/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8242091/viewspace-671343/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ConsistentHash是一种在分布式系统中解决数据分片、负载均衡的算法,用于解决数据分布和节点动态变化的问题。在Java中,可以通过实现ConsistentHash算法来分配数据并达到负载均衡的效果。 在Java中,可以使用TreeMap或者HashMap作为底层数据结构来实现ConsistentHash算法。TreeMap可以保证数据有序性,HashMap则可以提供更快的插入和查询速度。我们在这里以TreeMap为例来说明ConsistentHash的实现过程。 首先,我们需要创建一个哈希函数,将节点的IP地址或者ID映射为整数,作为节点的哈希值。然后,我们在TreeMap中存储节点的哈希值和对应的物理节点信息。 当有新的数据需要插入时,将数据的哈希值通过哈希函数计算得到对应的整数。然后,在TreeMap中找到大于等于该哈希值的最小键值对应的物理节点,将数据保存在该节点上。 当节点动态增加或删除时,我们需要重新计算所有已存在数据的哈希值,并将数据重新分配到新的节点上,以保持数据的均匀分布。 通过使用ConsistentHash算法,我们可以实现数据的分片存储和负载均衡,使得在节点动态变化的情况下,系统的性能和可扩展性得到有效的提升。 总之,ConsistentHash算法是一种在分布式系统中解决数据分片、负载均衡问题的算法。在Java中,我们可以通过实现ConsistentHash算法,使用TreeMap或者HashMap来实现数据分配和节点动态变化的管理。这样可以有效提高系统的性能和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值