Как обрабатывается таблица UPDATE СУБД? - PullRequest
5 голосов
/ 09 августа 2010

Предположим, у меня есть таблица и индекс

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

б)

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

в) Что-то еще полностью происходит

Поскольку это может зависеть от самой базы данных, как это происходит в Oracle?

Ответы [ 2 ]

1 голос
/ 11 августа 2010

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

"Если Oracle использует индекс (B-дерево) для поиска обновляемых данных, он откладывает любые обновления индекса (B-дерево), необходимые до концаобновления, затем сортирует ключи индекса (с их строками) для значений до и после перед применением массовых обновлений к индексам "

Если вы провели детальную трассировку, события ожидания показывают файл/ детали блока для ввода-вывода.Оттуда должна быть возможность определить объект (используя DBA_EXTENTS) и, таким образом, порядок, в котором осуществляется доступ к вещам.

Тем не менее, он довольно академический и не должен влиять на то, как вы кодируете вещи.

0 голосов
/ 10 августа 2010

Чтобы увидеть план выполнения вашего конкретного оператора обновления:

  1. Включить трассировку для вашей сессии
  2. Запустите свой PL / SQL
  3. запустите tkprof для файла трассировки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...