Сен 122011
 

Представим себе, что у нас была некая большая таблица с индексом, в которую мы писали и удаляли много данных. Индекс при записи данных рос, а при удалении он не уменьшался, но в нём появлялись "пустоты", которые не использовались при вставке новых данных.
Теперь сегмент, содержащий индекс, разросся и надо решить, что с ним делать.

Сначала узнаем, насколько он велик:

SELECT d.segment_name, d.bytes
FROM dba_segments d
WHERE d.segment_name = 'INDEXNAME'
	AND d.owner='OWNERNAME';

Прежде чем решить, что нам делать с этим индексом, разберёмся в различиях между rebuild и coalesce.

  1. Rebuild
    • Позволяет менять физические параметры хранения сегмента (например, менять табличное пространство).
    • Требует много места, по сути создаёт новый сегмент, куда упорядоченно копирует данные, после чего переименовывает его, а старый удаляет.
    • Требует много времени.
    • Блокирует таблицу. Будучи запущенным с параметром online, всё рано блокирует таблицу ненадолго.
    • Уменьшает размер сегмента, т.е. освбождённое место появляется в dba_free_space и может быть использовано для других объектов.
  2. Coalesce
    • Не позволяет менять параметры хранения сегмента.
    • Дополнительного места не требует.
    • Работает быстро.
    • Не блокирует таблицу вообще.
    • Не уменьшает размер сегмента, а просто реорганизует свободное место внутри него, перемещая "пустоты" к концу. Для других объектов высвобожденное место будет недоступно, но при добавлении записей в таблицу оно будет использоваться, т.е. сегмент некоторое время не будет расти.

Вот картинка, иллюстрирующая работу coalesce:

Блоки (leaf blocks) нашего индекса были заполнены частично. После операции coalesce первый блок заполнен на 100%, а второй - на 25% (в нашем примере PCTFREE=0).

Вывод: coalesce нам поможет, если индекс сильно фрагментирован за счёт многократных удалений, и к таблице часто выполняются запросы вида select * from table order by that_field. Запросы такого типа будут работать быстрее, и не потребуется перестройка индекса.
Если надо высвободить место или перенести индекс в другое табличное пространство, то нужно использовать rebuild.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)