2010-08-09 12 views
5

Supongamos que tengo una tabla y un índice en que¿Cómo es una actualización de mesa manejado por un RDBMS?

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 

En este punto, me ejecutar esta instrucción DML

UPDATE A SET id = 5 WHERE id = 4 

¿Qué ocurre exactamente cuando se ejecuta esta declaración?

una)

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) Otra cosa sucede en su totalidad

Como esto puede depender de la propia base de datos, ¿cómo sucede en Oracle?

+1

supongo que las implementaciones varían y muchos de ellos será por defecto c) en lugar de ser introducidos de manera simplista en a) ob) ... – meagar

+0

Es esta tarea? –

+0

@Henk: No. Estoy tratando de entender cómo funciona esto. Este es un escenario que inventé. – Moeb

Respuesta

1

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

"Si Oracle usa un índice (B-tree) para encuentra los datos que se actualizarán, pospone las actualizaciones de índice (B-tree) necesarias hasta el final de la actualización, luego ordena las claves de índice (con sus ROWIDs) para el antes y después de valores antes de aplicar actualizaciones masivas a los índices"

Si usted hizo una huella detallada, los eventos de espera muestran los detalles de archivos/bloques para IO. A partir de ahí, debería ser posible para determinar el objeto (usando dba_extents) y por lo que el orden en el que se accede a las cosas.

Dicho esto, es bastante académica y no debe afectar a la forma de un mejor código.

0

Para ver el plan de ejecución de su estado de actualización en particular:

  1. activar el seguimiento de la sesión
  2. ejecutar su PL/SQL
  3. TKPROF corrida en el archivo de seguimiento
Cuestiones relacionadas