加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_马鞍山站长网 (https://www.0555zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle高并发系列1:DML引起的常见问题及优化思路

发布时间:2021-01-08 07:25:15 所属栏目:站长百科 来源:网络整理
导读:副标题#e# 《Oracle高并发系列1:DML引起的常见问题及优化思路》要点: 本文介绍了Oracle高并发系列1:DML引起的常见问题及优化思路,希望对您有用。如果有疑问,可以联系我们。 作者介绍 王鹏冲,平安科技数据库技术专家,浸淫数据库行业十多年,对Oracle数据

解决思路:? ?

  1. 删除无用索引.为什么把这个显而易见的措施放到第一位呢,其实是有来由的.很多开发人员其实并不知道一个表上若创建过多索引会对DML产生影响,只知道创建索引对查询带来帮助,有些夸张的甚至会为一个表的每个列上都创建单列或组合索引.但是事实证明,经过DBA的采样监控,很多索引可能一年半载都不会被用到,那么还不删除这些索引更待何时?
  2. 将索引改造为hash分区索引.原理是可以打散并发操作的叶子节点.
  3. 将索引改造为反序索引.原理同上,因为是reverseindex,同样可以打散high key的叶子节点.
  4. 设置更小的block size,比如8k -> 4k – 2k.原理一样,因为更小的索引block里面存放的条目更少,理论上减少了两个不同会话同时访问同一个block的几率,进而减少了争用.但是这个方案其实会有其它副作用,除非其它方案都不能考虑,否则不建议这个方案.
  5. 重建索引. 为什么重建索引对这个问题能够带来帮助呢,因为重建索引后减少了索引的碎片,索引block变得更加紧凑,减少了index leaf block split时寻找空块的时间,提高了Oracle进行索引分裂时的效率,进而可以减少等待时间.
  6. 如果index contention的对象不是leaf block,而是rootblock,则可以考虑通过以下方法激活索引的root block分裂时的优化:1)alter system set events ‘43822 trace name context forever,level1’;

    2)event 43822启用后,对于root block的split进行了增强,不会超过5次的index block reclamation,Oracle就会去申请分配新块了.

背景知识:

Oracle在索引split时中寻找可复用的free block的过程如下:

Oracle不会一开始就让index segment申请分配新的空间(这会造成index segment的空间过度增长),而是到该index segment的其它地方搜索是否存在可用的Free Block,这些Free Block的要求是status是75%-100% Free的,server process会扫描这些75%-100% Free的block 并确认这些block 实际上是100%空的,如果找到100% Free Block则使用;如果没有则继续搜索,直到所有候选block都被检查过,这个行为叫做 probes on index block reclamation.每次寻找空块并failed,oracle就会增加这个统计指标: “failed probes on index block reclamation”.Oracle内部机制会控制要找多少次,不会去FULL SCAN所有index block的,failed超过一定次数后就会申请分配新的block.

不能重用的原因有2个:??

  1. 可能这个块不是100%free的,而是70% ~ <100% free的,也就是找到的这个block上面还有几行或者多行索引记录,所以不能被重用来做split.
  2. 可能这个块上还有一些其它的active transaction,所以它重用不了.

在这个过程中,Oracle还有机会找到的block其实已经是索引结构中的一个非空block,但是Oracle只会在splittingand relinking to index structure之后才会发现这个block其实是illegal的选择,这个时候Oracle会回滚这个操作,这个统计记录在‘transaction rollback’ in v$sysstat,然后继续寻找另外一个block.

(编辑:网站开发网_马鞍山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!