update的内部原理

来源:互联网 发布:网络阅读的好处议论文 编辑:程序博客网 时间:2024/06/05 15:48
用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
(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 结束-----------------




**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name:    guoyJoe

QQ:        252803295

Email:    oracledba_cn@hotmail.com

Blog:      http://blog.csdn.net/guoyJoe

ITPUB:   http://www.itpub.net/space-uid-28460966.html

OCM:     http://education.oracle.com/education/otn/YGuo.HTM
 _____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036



原创粉丝点击