Oracle中update的实现原理是什么?
例如 update user_t set pwd='123' where login='root';
update是如何实现的?执行顺序是:
1.先查询出login='root'的数据;
2.删除login='root'的数据;
3.插入数据,信息是login='root',pwd='123' 吗?
例如 update user_t set pwd='123' where login='root';
update是如何实现的?执行顺序是:
1.先查询出login='root'的数据;
2.删除login='root'的数据;
3.插入数据,信息是login='root',pwd='123' 吗?
1.检查SGA中是否存在login='root'的数据块,若不存在则从磁盘读入
2.获取拥有该数据块的latch,否则等待
3.将修改前映象写入undo,然后修改该块
4.修改完毕,commit,分配scn,将变化redo日志写入日志文件,释放相关的锁资源
先DELETE那条你要修改的记录
然后INSERT一条新的记录
LZ没有仔细看2楼的回复!3.将修改前映象写入undo,然后修改该块
4.修改完毕,commit,分配scn,将变化redo日志写入日志文件,释放相关的锁资源
昨天晚上想了个直观的方法来验证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的值会有所改变(有时侯不改变)
这个我实验过,是对的,先删在插入 好像是sqlserver的(不确定,我用hibernate是这样的 )
分区表上,元数据和更新后数据不在同一分区的时候,操作是删除再插入。
当同一分区的时候或者不是分区表的时候,应该用覆盖这个词更恰当一点。因为这时候跟块的分布等等有关。