Oracle, как очень большая база данных, широко используется в крупных организациях с огромной пропускной способностью данных и обширными компьютерными сетями, таких как финансы, почта и телекоммуникации, электроэнергетика и гражданская авиация. Что касается системных администраторов, то особенно важно обеспечить стабильную работу сети и повысить производительность базы данных, чтобы сделать ее более безопасной и эффективной. Фрагментация базы данных, являющаяся основным фактором, влияющим на производительность базы данных, должна привлекать достаточно внимания администратора базы данных. Своевременное обнаружение и очистка фрагментов является основной задачей администратора базы данных.
1. Почему возникают фрагменты?
Когда база данных создается, она будет разделена на несколько логических сегментов (сегментов), известных как табличные пространства (табличное пространство), например системное (системное) табличное пространство, временное (временное) табличное пространство и т. д. Табличное пространство может содержать несколько диапазонов данных (экстент) и один или несколько блоков свободного диапазона, то есть свободное пространство (свободное пространство).
Логические отношения между табличными пространствами, сегментами, категориями и свободными пространствами следующие:
При создании сегмента в табличном пространстве для начальной области сегмента будет выделено пространство из эффективного свободного пространства табличного пространства. Когда эти начальные диапазоны заполнятся данными, сегмент запросит добавление еще одного диапазона. Этот процесс расширения будет продолжаться до тех пор, пока не будет достигнуто максимальное значение диапазона, и в табличном пространстве может не остаться свободного места для следующего диапазона. Самая идеальная ситуация — когда данные сегмента можно хранить в одной категории. Таким образом, все данные хранятся рядом с другими данными в сегменте, и для поиска данных требуется меньше указателей. Однако во многих случаях сегмент содержит несколько полей, и нет возможности доказать, что эти поля хранятся рядом. Когда необходимо удовлетворить требования к пространству, база данных больше не закрывает соседний свободный диапазон (если нет такой возможности), а ищет самый большой свободный диапазон в табличном пространстве для использования. Постепенно при этом будут образовываться все более дискретные, обособленные, более мелкие свободные пространства, то есть фрагменты.
2. Влияние фрагментации на систему
С течением времени широкое использование прикладных систем на базе баз данных будет генерировать все больше и больше фрагментов, которые окажут на базу данных следующие два важных воздействия:
1) Снижение производительности системы.
В общем, когда необходимо удовлетворить требования к пространству, база данных сначала ищет самый большой свободный диапазон в данный момент, и «самый большой» свободный диапазон постепенно становится меньше, и становится все труднее найти достаточно большой свободный диапазон. сложно, поэтому препятствия скорости в табличном пространстве делают распределение пространства базы данных все дальше и дальше от идеального состояния;
2) Распределение большого количества табличного пространства
Хотя некоторые свободные области (например, pctincrease табличного пространства не равно нулю) будут периодически объединяться фоновым процессом SMON (мониторинг системы), всегда есть некоторые свободные области, которые не могут быть закрыты автоматически, что приводит к потере большого количества таблицы. космос. .
3. Фрагментный расчет свободных категорий
Поскольку фрагментация свободного пространства состоит из нескольких частей, таких как количество категорий, максимальный размер диапазона и т. д., мы можем использовать значение FSFI — индекс фрагментации свободного пространства (индекс фрагментации свободного пространства), чтобы интуитивно отразить:
FSFI=100*КОРЕНЬ(макс(размер)/сумма(размеры))*один/КОРЕНЬ(КОРЕНЬ(количество(размеры)))
Как можно видеть, максимальное значение FSFI равно 100 (идеальное одно табличное пространство). По мере увеличения области значение FSFI уменьшается медленно, а по мере уменьшения максимального размера области значение FSFI уменьшается быстро.
Следующий скрипт можно использовать для расчета значения FSFI:
rem FSFI Вычисление значения
рем fsfi.sql
столбец формата FSFI 999,99
выберите имя_табличного_пространства, sqrt(max(blocks)/sum(blocks))*
(100/кв.кв.(кв.кв.(число(блоков)))) FSFI
из dba_free_space
группировать по имени tablespace_name по единице;
катушка fsfi.rep;
/
расмотать;
Например, при запуске скрипта fsfi.sql в определенной базе данных теряются следующие значения FSFI:
TABLESPACE_NAME FSFI
------------------------------- -------
РБС 74,06
СИСТЕМА 100.00
ТЕМП. 22,82
ИНСТРУМЕНТЫ 75.79
ПОЛЬЗОВАТЕЛЕЙ 100,00
ПОЛЬЗОВАТЕЛЬСКИЕ_ИНСТРУМЕНТЫ 100,00
YDCX_DATA 47.34
YDCX_IDX 57.19
YDJF_DATA 33,80
YDJF_IDX 75,55
---- После расчета значения FSFI базы данных его можно использовать в качестве сопоставимого параметра. В табличном пространстве с достаточным эффективным свободным пространством и значением FSFI выше 30 проблемы с эффективным свободным пространством встречаются редко. Когда пространство близко к сопоставимым параметрам, его необходимо дефрагментировать.
4. Разбираем фрагменты бесплатных категорий
Значение pctincrease табличного пространства не равно нулю.
Вы можете изменить параметр хранения по умолчанию pctincrease табличного пространства на ненулевое значение. Обычно установите его в единицу, например:
изменить температуру табличного пространства
хранилище по умолчанию (pctincrease 1);
Таким образом, SMON автоматически сгруппирует свободные категории. Вы также можете сгруппировать бесплатные категории вручную:
изменить температуру объединения табличных пространств;
5. Подбор фрагментов абзаца
Мы знаем, что сегменты состоят из категорий. В некоторых случаях необходимо очистить фрагменты сегмента. Чтобы просмотреть информацию, связанную с сегментом, просмотрите словарь данных dba_segments, а для информации о категориях просмотрите словарь данных dba_extents.
Сегмент данных запроса
выберите имя_сегмента,имя_табличного_пространства,байты,блоки из USER_EXTENTS;
Запрос сегмента каталога
выберите имя_индекса,владелец_таблицы,имя_таблицы,имя_табличного_пространства из USER_EXTENTS;
Просмотр информации о сегменте через dba_segments
выберите tablespacee_name,count(*) noobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) from
dba_segments группируется по сводке (имя_табличного_пространства);
Если сегмент чрезмерно фрагментирован, самый простой способ сжать его данные в диапазон — перестроить сегмент с правильными параметрами хранения, затем вставить данные из старой таблицы в новую таблицу и одновременно удалить старую таблицу. . Этот процесс можно выполнить с помощью инструмента «Импорт/Экспорт» (ввод/вывод).
Команда Export() имеет флаг (сжатый), который при чтении таблицы заставит команду Export определить объем физического пространства, выделенного для таблицы, и запишет в выходные данные дампа новый параметр хранилища инициализации — то есть все Выделить пространство. Если эта таблица закрыта, используйте инструмент Импорт () для ее регенерации. Таким образом, его данные будут помещены в новый, более крупный начальный сегмент. например:
exp пользователь/пароль file=exp.dmp compress=Y гранты=Y индексы=Y
table=(таблица первая, таблица вторая);
Если вывод прошел гладко, удалите экспортированную таблицу из библиотеки, а затем импортируйте таблицу из данных выходного дампа:
имп пользователь/пароль file=exp.dmp commit=Y буфер=64000 полный=Y