Что такое фрагментация индекса в Oracle SQL?

Кто-нибудь может объяснить, что такое фрагментация индекса? Я погуглил "Фрагментация индекса", но не нашел удовлетворительного ответа.

1 ответ

Оставив в стороне все не относящиеся к делу технические аспекты; Фрагментация в контексте базы данных - это упорядоченные данные, хранящиеся неупорядоченным образом. Это вызывает нежелательные накладные расходы на производительность, вызывая замедление работы базы данных.

Допустим, у вас есть стол с сотрудниками. Индекс содержит отсортированные данные для доступа к сотрудникам по их идентификационному номеру. Индекс содержит данные, хранящиеся последовательно. Для простоты у нас есть таблица, содержащая четырех сотрудников:

1   Anne
3   Charly
4   James
5   William

В ядре базы данных на странице хранится несколько сотрудников. Обычно это сортированный ковш фиксированного размера. Итак, давайте разместим сотрудников на странице. Предположим, что мы можем разместить на странице только двух сотрудников. В итоге мы получим:

[ Page 1, next page is page 2, there is no previous page ]
    1   Anne
    2   Charly

[ Page 2, there is no next page, but there is a previous page 1 ]
    4   James
    5   William

Проблема возникает, когда мы хотим добавить Берта с идентификационным номером 3. Он не помещается ни на одной странице. Не в конце страницы 1 или в начале страницы 2. Нам нужно создать новую страницу для Берта и исправить ссылки (предыдущие и следующие) страницы, чтобы они по-прежнему были упорядочены.

[ Page 1, next page is page 3, there is no previous page ]
    1   Anne
    2   Charly

[ Page 2, there is no next page, but there is a previous page 3 ]
    4   James
    5   William

[ Page 3, next page is page 2, previous page 1 ]
    3   Bert

Обратите внимание, что страница 3 находится в конце списка. Механизм базы данных по-прежнему может запускаться со страницы 1 и просматривать страницы в упорядоченном виде; а именно, перейдя на следующую страницу 3, а затем на следующую страницу 2. Однако это не оптимально. Движку нужно прыгать вперед и назад, чтобы найти данные, вместо того, чтобы просто переходить от страницы 1 к последней. Это и есть фрагментация индекса.

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

[ Page 1, next page is page 2, there is no previous page ]
    1   Anne
    2   Charly

[ Page 2, next page is page 3, previous page 1  ]
    3   Bert
    4   James

[ Page 3, there is no next page, previous page 2 ]
    5   William

Вы спросите, а почему бы не сделать это прямо сейчас? Всегда есть компромисс. Изменение наименьшего количества данных (в данном случае страниц) беспокоит наименьшее количество других пользователей (в этом случае другие запросы или изменения в базе данных). В сценарии, когда новая страница размещается в конце, нам нужно изменить только несколько страниц. Если бы мы обновили индекс так, чтобы он был полностью упорядочен, это потребовало бы изменения большинства страниц, если не всех из них. При изменении страницы другие изменения на той же странице (или, что еще хуже) должны ждать фиксации предыдущего изменения.

Другие вопросы по тегам