2010-08-09 42 views
5

假設我有一個表,並在其上如何通過RDBMS處理表UPDATE?

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 

執行該語句時,究竟會發生什麼?

一)

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 

三)完全是另一回事發生

由於這可能是依賴於數據庫本身,它是如何發生的甲骨文上?

+1

我猜這個實現有所不同,其中很多會默認爲c)而不是簡單地插入a)或b)... – meagar 2010-08-09 16:54:16

+0

這是功課嗎? – 2010-08-09 17:41:40

+0

@亨克:不,我只是想了解它是如何工作的。這是我編造的場景。 – Moeb 2010-08-10 03:13:10

回答

1

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

「如果Oracle使用(B-tree)索引找到要更新的數據,則 會推遲直到更新結束時需要的任何(B-樹)索引更新 ,然後將索引關鍵字 的rowid)在之前,如果你做了一個詳細的跟蹤應用批量更新 索引」

之前之後 值,等待事件顯示IO文件/塊的詳細信息。從那裏應該可以確定對象(使用DBA_EXTENTS)以及訪問事物的順序。

這就是說,這是非常的學術,不應該影響你如何編碼的東西。

0

要查看執行計劃爲特定的更新語句:

  1. 打開跟蹤會話
  2. 運行您的PL/SQL
  3. 運行TKPROF上跟蹤文件