2010-08-09 2 views
0
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 

updated simple table A 
---------------------- 

rowid id name 
123  1 A 
124  5 G 
125  2 R 
126  7 P 

Предполагая, что индекс не обновлялся, когда таблица обновлялась, как произойдет обновление индекса?Как происходит восстановление индекса после обновления таблицы?

Будет ли это перестраиваться с нуля? Или это каким-то образом использует старый индекс?

ответ

4

Индекс должен быть помечен как непригодный для использования/отключен, чтобы не обновлять, когда строка была обновлена, когда она снова включена/помечена для использования, она будет построена с нуля, поскольку в этот момент содержимое индекса бесполезно , но схема индекса может быть повторно использована.

Это другой сценарий для вашего другого вопроса, который в другой ситуации перестраивает индекс, который все еще включен.

0

Если вы хотите, чтобы заставить восстановление индекса вы можете использовать то, что я ниже:

ALTER INDEX my_index_name REBUILD WITH ONLINE = ON 

Но Андрей прав, он должен обновляться автоматически.

Я бы рекомендовал прочитать this article, это один из лучших, что я видел по индексам.

Вот отрывок из статьи о новинках индекса:

в любое время, что изменили ряд, эти изменения должны быть сделаны не только в базовой таблицы (кластерный индекс или кучу) , но и в любом индексе, который содержит столбцы, на которые повлияло изменение . Это относится к вставке, операции обновления и удаления.

3

Вы задаете много вопросов об Oracle-индексах. Несомненно, лучшим ресурсом для понимания этих объектов является блог Ричарда Фута. Серьезно, он не пишет ни о чем другом (дайте или возьмите случайный пост Дэвиду Боуи, но у всех нас есть наши недостатки). Check it out.

В текущем контексте вы должны прочитать его презентацию: Oracle B-Tree Index Internals:Rebuilding The Truth.

+0

Спасибо за отличные ссылки, @APC. – Moeb

0

Ваш вопрос зависит от СУБД.

В большинстве ситуаций rowid является суррогатом для адреса строки в пространстве базы данных. Некоторые СУБД хранят фактический адрес в индексе, а не rowid, даже если все, что вы можете видеть, - это rowid. Если СУБД хранит rowid в индексе, какой-то механизм все равно должен перевести это в адрес, прежде чем можно будет напрямую выполнить поиск строки.

Практически в любой СУБД обновление к таблице и обновление индекса будут выполняться в контексте одной и той же транзакции. Это означает, что вам не важно, обновляется ли индекс перед таблицей, или таблица обновляется до индекса.

Для единственной СУБД, чья внутренность, которую я знаю, записи индекса обновляются по строкам за строкой сразу после обновления самой строки. И записи индекса содержат адреса строк, а не идентификаторы строк.

Мне никогда не приходилось беспокоиться об этом на практике, потому что к концу транзакции все это было сделано в любом случае.

В любом из этих случаев я бы не назвал это «восстановление индекса». Это действительно обновление индекса. «Перестроение индекса» предлагает массивную переписку.

Смежные вопросы