ITPub博客

首页 > > > update的内部原理

update的内部原理

作者:guoyjoe 时间:2020-05-13 07:01:40 0 删除 编辑
用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 结束-----------------
 

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

请登录后发表评论 登录
全部评论
云贝学院院长 ,象行数据CEO,尖峰在线教育创始人,ITPUB管理版版主,曾就职于连连支付、唯品会、吉利汽车。拥有系统架构设计师高级职称,AWS SAA/SAP、阿里云 ACP/ACE、Oracle OCP/OCM、MySQL原厂认证讲师/ OCP等证书。

注册时间:2013-01-30

  • 博文量
    58
  • 访问量
    18631