Как происходит перестройка индекса после обновления таблицы? - PullRequest
0 голосов
/ 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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 09 августа 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ALTER INDEX my_index_name REBUILD WITH ONLINE = ON

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

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

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

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

...