如何通过RDBMS处理表UPDATE?

时间:2010-08-09 16:52:16

标签: database oracle algorithm indexing

假设我有一个表和一个索引

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中实现?

2 个答案:

答案 0 :(得分:1)

来自:http://jonathanlewis.wordpress.com/2006/11/22/tuning-updates/

  

“如果Oracle使用(B树)索引   找到要更新的数据吧   推迟任何(B树)索引更新   需要到更新结束,   然后对索引键进行排序(使用它们的   rowids)用于之前和之后   应用批量更新之前的值   索引“

如果您进行了详细跟踪,则等待事件会显示IO的文件/块详细信息。从那里应该可以确定对象(使用DBA_EXTENTS)以及访问事物的顺序。

那就是说,这是非常学术性的,不应该影响你编码的方式。

答案 1 :(得分:0)

要查看特定更新语句的执行计划:

  1. 启用会话跟踪
  2. 运行您的PL / SQL
  3. 在跟踪文件上运行tkprof