假设我有一个表和一个索引
original simple table A
------------------------
rowid | id name
123 | 1 A
124 | 4 G
125 | 2 R
126 | 3 P
index on A.id
-------------
id rowid
1 123
2 125
3 126
4 124
此时,我执行此DML语句
UPDATE A SET id = 5 WHERE id = 4
执行此声明时究竟发生了什么?
A)
BEGIN
go to index
search for `id == 4` (B tree index generally)
find that `rowid = 124`
go to that location
update id in the table
come back (? I am not sure)
update the index
END
b)中
BEGIN
go to index
search for `id == 4` (B tree index generally)
update the id value in index
find that `rowid = 124`
go to that location
update id in the table
END
c)完全发生其他事情
由于这可能取决于数据库本身,如何在Oracle中实现?
答案 0 :(得分:1)
来自:http://jonathanlewis.wordpress.com/2006/11/22/tuning-updates/
“如果Oracle使用(B树)索引 找到要更新的数据吧 推迟任何(B树)索引更新 需要到更新结束, 然后对索引键进行排序(使用它们的 rowids)用于之前和之后 应用批量更新之前的值 索引“
如果您进行了详细跟踪,则等待事件会显示IO的文件/块详细信息。从那里应该可以确定对象(使用DBA_EXTENTS)以及访问事物的顺序。
那就是说,这是非常学术性的,不应该影响你编码的方式。
答案 1 :(得分:0)
要查看特定更新语句的执行计划: