Oracle中update的实现原理是什么?
例如 update user_t set pwd='123' where login='root';
update是如何实现的?执行顺序是:
1.先查询出login='root'的数据;
2.删除login='root'的数据;
3.插入数据,信息是login='root',pwd='123' 吗?

解决方案 »

  1.   

    update user_t set pwd='123' where login='root'; 
    1.检查SGA中是否存在login='root'的数据块,若不存在则从磁盘读入
    2.获取拥有该数据块的latch,否则等待
    3.将修改前映象写入undo,然后修改该块
    4.修改完毕,commit,分配scn,将变化redo日志写入日志文件,释放相关的锁资源
      

  2.   

    学习!~ PGA自动管理原理深入分析及性能调整
      

  3.   

    是:
    先DELETE那条你要修改的记录
    然后INSERT一条新的记录
      

  4.   


    LZ没有仔细看2楼的回复!3.将修改前映象写入undo,然后修改该块
    4.修改完毕,commit,分配scn,将变化redo日志写入日志文件,释放相关的锁资源 
      

  5.   

    继续我的留言
    昨天晚上想了个直观的方法来验证ORACLE 中UPDATE语句的原理
    个人观点 UPDATE 语句只是修改相应的字段 而不不是先删除再添加
    具体实验过程如下:
    create table test (lie1 number(10),lie2 varchar2(10));
    insert into test values(1000,'sdfg');
    insert into test values(1111,'gggg');
    insert into test values(1311,'fgg');
    insert into test values(4441,'gsdfg');
    commit;
    select rowid from test;
    然后你随便UPDATE任何一条记录 其ROWID的值不会改变
    但是当你DELETE .....然后再INSERT INTO ....此时ROWID的值会有所改变(有时侯不改变)
      

  6.   

    只知道sql server中是这样实现的,Oracle不清楚,帮楼主顶...
      

  7.   


    这个我实验过,是对的,先删在插入 好像是sqlserver的(不确定,我用hibernate是这样的 ) 
      

  8.   

    Toms 的书籍介绍了UPDATE原理是先删除,后插入。
      

  9.   

    研究UPDATE的原理,其实没什么实际意义的。参考2楼。
    分区表上,元数据和更新后数据不在同一分区的时候,操作是删除再插入。
    当同一分区的时候或者不是分区表的时候,应该用覆盖这个词更恰当一点。因为这时候跟块的分布等等有关。