Со временем эффективность использования пространства индексом может быть утрачена. Особенно это касается при интенсивной работе с данными, частых процедурах вставки, удаления или изменения.
Можно провести анализ используемого индексом пространства.
Для этого анализируется структура индекса, с помощью SQL оператора ANALYZE INDEX … VALIDATE STRUCTURE, а затем запрашивается представление INDEX_STATS:
Note: ANALYZE INDEX … VALIDATE STRUCTURE ставит блокировку на таблицу, по которой построен индекс.
Пересоздать индекс или объединить?
Несколько раз я упоминал о том, что вместо пересоздания индекса можно объединить данные в блоках, но что выгоднее?
Прежде чем выполнять то или иное действие имеет смысл взвесить все за и против, стоимость и выгоду, получаемую в результате каждого варианта. Ниже приведу небольшую таблицу со стоимостью и выгодами каждого варианта:
Как работает объединение данных проиллюстрировано на рисунке:
Можно провести анализ используемого индексом пространства.
Для этого анализируется структура индекса, с помощью SQL оператора ANALYZE INDEX … VALIDATE STRUCTURE, а затем запрашивается представление INDEX_STATS:
-- анализируем (dbms_stats не подходит)
ANALYZE INDEX object_id_idx VALIDATE STRUCTURE;
-- смотрим
SELECT PCT_USED FROM INDEX_STATS WHERE NAME = 'имя_индекса';
ANALYZE INDEX object_id_idx VALIDATE STRUCTURE;
-- смотрим
SELECT PCT_USED FROM INDEX_STATS WHERE NAME = 'имя_индекса';
Note: ANALYZE INDEX … VALIDATE STRUCTURE ставит блокировку на таблицу, по которой построен индекс.
Процент использования пространства индексом зависит от того, как часто выполняются, вставляются, обновляются или удаляются ключи индекса. Рекомендуется составить историю средней эффективности использования пространства индексом и в дальнейшем отталкиваться от нее. Для этого выполните несколько раз последовательность операций:
- Анализ статистики
- Проверка индекса
- Проверка параметра PCTUSED
- Удаление и перестройка индекса или слияние данных в блоках
Если обнаружиться, что использование пространства индексом опустилось ниже среднего уровня, пространство индекса можно уплотнить, удалив или перестроив индекс, либо выполнив слияние данных в индексных блоках.
Пересоздать индекс или объединить?
Несколько раз я упоминал о том, что вместо пересоздания индекса можно объединить данные в блоках, но что выгоднее?
Прежде чем выполнять то или иное действие имеет смысл взвесить все за и против, стоимость и выгоду, получаемую в результате каждого варианта. Ниже приведу небольшую таблицу со стоимостью и выгодами каждого варианта:
Перестройка индекса | Слияние данных в индексных блоках |
Позволяет быстро переместить индекс в другое табличное пространство | Не может переместить индекс в другое табличное пространство |
Высокая стоимость: требуется больше дискового пространства | Низкая стоимость: не требует дополнительного дискового пространства |
Создает новое дерево, по возможности сокращая его | Объединяет листовые блоки одной и той же ветви дерева |
Позволяет быстро менять параметры хранения и табличного пространства и не удалять при этом оригинальный индекс | Быстро освобождает листовые блоки индекса для использования |
Как работает объединение данных проиллюстрировано на рисунке:
Слева представлен индекс до объединения, справа после выполнения команды:
ALTER INDEX ALL_ORACLE_EVENT_NO COALESCE;