Oracle update的内部原理

用ORACLE内部原理描述以下过程:

1、sqlplus user/passwd@orcl

2、update t set a=1 where b='ss';

3、commit;

4、exit

1、sqlplus user/passwd@orcl

(1)、客户端SQLPLUS连接监听

(2)、监听收到连接请求,Fork一个Oracle进程,作为服务器进程,同时分配一小块PGA内存。

(3)、服务器进程和客户端建立连接。

(4)、服务器进程(以下简称进程)查询USER$、PROFILE$等数据字典,校验用户是否可以登录。

(5)、如果可以登录,连接创建完成。

2、update t set a=1 where b='ss';

(一)、如果B列上无索引

(1)、查询SEG$等数据字典,找到T表段头

(2)、从段头读出Extent Map,开始全扫描

(3)、找到第一个满足条件的行,进行修改

(4)、查找同一块中剩下的行,先构造一个CR块,在CR块中继续查找,如果又找到满足条件的行,在Xcur块中修改。

(二)、如果B列上有索引,且版本不是11GR1(10G、11GR2),则不需要构造CR块

(三)、B列无论是否有索引,在11GR1下都需要构造CR块。

(四)、如果A列上有索引,增加索引维护步骤:

(1)、先在原索引块中删除要修改的原值

(2)、再将新值插入

(五)、任何块的修改,都有以下步骤(非IMU)

(1)、在PGA中生成UNDO段头事务表的后映像(5.2)

(2)、在PGA中生成UNDO块的后映像(5.1)

(3)、在PGA中生成DataBlock块的后映像(11.9)

(4)、将前三个Redo矢量做为一条Redo Recorder写入Log buffer

(5)、修改UNDO段头的事务表,事务正式开始。

(6)、修改UNDO块,写入DataBlock的前映像。

(7)、修改DataBlock,将新值“1”写入Buffer cache。

(六)、任何块的修改,都有以下步骤(IMU)

(1)、在PGA中生成DataBlock块的后映像(11.9)

(2)、在PGA中生成UNDO段头事务表的后映像(5.2)

(3)、在PGA中生成UNDO块的后映像(5.1)

(4)、将前三个Redo矢量做为一条Redo Recorder写入Shared pool中的Private strand。

(5)、将DataBlock中的前映像值,写入Shared pool中的Imu pool。

(6)、修改UNDO段头的事务表。

(7)、修改UNDO块,写入DataBlock的前映像。

(8)、修改DataBlock,将新值“1”写入Buffer cache。

3、commit;

(一)、非IMU下(按最常见的快速提交):

(1)、在PGA中生成Commit的Redo 信息(编号5.4),另做为一条Redo recorder,写入Log buffer

(2)、修改事务表相应Slot,声明事务已提交。

(3)、修改DataBlock,在ITL Slot中写入快速提交标志和SCN。每行上的行锁不清0。

(4)、通知Lgwr,将Log buffer写入Redo file。

(5)、收到Lgwr通知,写入完成。

(6)、向用户发收提交完成信息。

(一)、IMU下(按最常见的快速提交):

(1)、在PGA中生成Commit的Redo 信息(编号5.4),传入Shared pool中的Private strand,追加在事务之前的Redo recorder之后。

(2)、修改事务表相应Slot,声明事务已提交。

(3)、修改DataBlock,在ITL Slot中写入快速提交标志和SCN。每行上的行锁不清0。

(4)、将Private Strand中的Redo数据写入Log buffer。

(5)、通知Lgwr,将Log buffer写入Redo file。

(6)、收到Lgwr通知,写入完成。

(7)、向用户发收提交完成信息。

4、exit

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

(1)、断开连接,中止服务器进程,释放PGA

只是个提纲,没有锁、Latch、Mutex等

也不是太完善,SQL解析部分没怎么提

update A where id=1;

update A where id=2;

commit;

非IMU下:

----------------第一条Redo recoder 开始-----------------

事务开始

update A where id=1对应UNDO的Redo

update A where id=1对应数据块的Redo

----------------第一条Redo recoder 结束-----------------

----------------第二条Redo recoder 开始-----------------

update A where id=2对应UNDO的Redo

update A where id=2对应数据块的Redo

----------------第二条Redo recoder 结束-----------------

----------------第三条Redo recoder 开始-----------------

Commit 事务结束

----------------第三条Redo recoder 结束-----------------

在非IMU下,一共会生成3条Redo recoder,也就是redo entries会增加3。

而在IMU下,是这样的:

----------------第一条Redo recoder 开始-----------------

update A where id=1对应数据块的Redo

事务开始

update A where id=2对应数据块的Redo

Commit 事务结束

update A where id=1对应UNDO的Redo

update A where id=2对应UNDO的Redo

----------------第一条Redo recoder 结束-----------------

时间: 2024-12-02 08:40:43

Oracle update的内部原理的相关文章

Oracle Freelist和HWM原理探讨及相关性能优化

oracle|性能|优化 Oracle Freelist和HWM原理探讨及相关性能优化 中兴通讯重庆研究所 游波   关键词:Freelist,HWM,存储参数,段,块,dump,优化 文章摘要:    近期来,FreeList的重要作用逐渐为Oracle DBA所认识,网上也出现一些相关的讨论.本文以FreeList为线索对Oracle的存储管理的原理进行较深入的探讨,涉及Oracle段区块管理的原理,FreeList算法等.而与FreeList密切相关的一个重用特性HWM,与sql性能密切相

Oracle UPDATE语句深入解析

这是曾经Oracle原厂的一位兄弟问我的一个问题,后来也有些人问起这个问题: 用ORACLE内部原理描述以下过程: 1.sqlplus gyj/gyj@orcl 2.updatet_gyj set name='gyj1' where id=1; 3.commit; 4.exit 一看这个问题是不是灰常复杂,阿里系的童鞋特别喜欢用类似这样的题目面试人,从中可以快速的判断你是哪个级别的DBA(初级/中级/高级),在这个问题上我给大家抛砖迎玉,由于能力有限只能做简单解释,欢迎大家一起参与讨论并补充.嘿

JVM内部原理

JVM内部原理 原文链接 原文作者:James D Bloom 翻译:梅小西(904516706)  校对:吴京润   这篇文章详细描述了Java虚拟机的内在结构.下面这张图来自<The Java Virtual Machine Specification Java SE 7 Edition>,它展示了一个典型的JVM的主要的内部结构. 接下来的2个部分,将详细介绍这幅图中所有组成结构. 第一部分涵盖了每个线程都会生成的结构, 第二部分 涵盖了单独的每个线程生成的结构. 线程 JVM 系统线程

系统-硬盘分区内部原理????

问题描述 硬盘分区内部原理???? 一块硬盘可以分为4个主分区,而系统在其中的一个分区中,那么这个分区就需要主导扇区来引导已经分区表来确定,不同系统的分区格式有可能不一样,现在一个硬盘要把分成几个区是要用的分区表来确定吗? 解决方案 无论操作系统和文件系统是怎样的,分区表.引导记录是公认的标准.所谓硬盘可以分为4个分区已经是老皇历了,现在的PC使用UEFI固件和新的GUID分区表,可以分无数的分区. 解决方案二: 为此,可以贴两篇科普文帮你扫盲下http://wenku.baidu.com/li

Oracle数据库一致性读原理简介

在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复 (Instance Recovery). 一致性读是相对于脏读(Dirty Read)而言的.假设某个表T中有10000条记录,获取所有记录需要15分钟时间.当前时间为9点整,某用户A 发出一条查询语句:select * from T,该语句在9点15分时执行完毕.当用户A执行该SQL语句到9点10分的时候,另外一个用户B发出了一条 d

Android GUI系统之SurfaceFlinger(5) BufferQueue内部原理

1.1 BufferQueue详解 上一小节我们已经看到了BufferQueue,它是SurfaceTextureClient实现本地窗口的关键.从逻辑上来推断,BufferQueue应该是驻留在SurfaceFlinger这边的进程中.我们需要进一步解决的疑惑是: 每个应用程序可以对应几个BufferQueue,它们是一对一.多对一或者是一对多? 应用程序所需要的绘图空间是由谁分配的? 在音频系统的学习中,我们知道AudioTrack和AudioFlinger是通过共享内存的形式来进行数据传递

oracle update数据更新的实现语句

  oracle update数据更新的实现语句 SQL> -- create demo table SQL> create table Employee( 2 ID VARCHAR2(4 BYTE) NOT NULL, 3 First_Name VARCHAR2(10 BYTE), 4 Last_Name VARCHAR2(10 BYTE), 5 Start_Date DATE, 6 End_Date DATE, 7 Salary Number(8,2), 8 City VARCHAR2(1

解析mysql与Oracle update的区别

本篇文章是对mysql与Oracle update的区别进行了详细的分析介绍,需要的朋友参考下   update :单表的更新不用说了,两者一样,主要说说多表的更新 复制代码 代码如下:        Oracle> Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标         update (         select t.charger_id_ new_charger_id_         from t_cus_year_status t

Apache Storm内部原理分析

本文算是个人对Storm应用和学习的一个总结,由于不太懂Clojure语言,所以无法更多地从源码分析,但是参考了官网.好多朋友的文章,以及<Storm Applied: Strategies for real-time event processing>这本书,以及结合自己使用Storm的经历,希望对于想深入一点了解Storm原理的朋友能有所帮助,有不足之处欢迎拍砖交流. Storm集群架构 Storm集群采用主从架构方式,主节点是Nimbus,从节点是Supervisor,有关调度相关的信息