“Невидимые миру дыры” в табличных пространствах OracleИсточник: Interface Владимир Пржиялковский, преподаватель УКЦ Interface Ltd.
Известно, что память в табличных пространствах выдается объектам, хранимым в БД, экстентами. Место, которое занимает объект (в типичном случае - таблица или индекс) на диске, можно определить из системной таблицы USER_EXTENTS, содержащей перечень всех экстентов всех сегментов пользователя. Однако картина, выдаваемая подобным запросом, может оказаться слишком общей. За списком экстентов таблицы может скрываться:
Маленький эксперимент Заполненность экстентов данными способна вызвать в памяти швейцарский сыр, объемный снаружи, но полный пустот внутри. Проведем эксперимент. Он рассчитан на типичный размер блока 4096 байт и параметры табличного пространства, по умолчанию используемые в версии Oracle 8.1.5. Наберем SQL>CREATE TABLE emp1 AS SELECT * FROM emp; После этого семь раз подряд нажмем / и возврат каретки, а затем SQL> INSERT INTO emp1 (SELECT * FROM emp1 where rownum<1600); Проверим число занятых таблицей EMP1 экстентов: SQL> SELECT tablespace_name,extent_id,bytes,blocks Занято два экстента. Теперь добавим 50 еще строк в таблицу: SQL> INSERT INTO emp1 (SELECT * FROM emp1 where rownum<50); Повторим запрос к USER_EXTENTS и увидим, что добавился новый экстент: TABLESPACE_NAME EXTENT_ID BYTES BLOCKS Очевидно, что экстент с номером 2 в сегменте таблицы EMP1 практически пуст, и реально таблица занимает не 32*3 блока, а немногим более 64. Более того, выдадим SQL> DELETE FROM emp1 WHERE ROWID IN Осталась всего одна строка (последняя по счету), но запрос к USER_EXTENTS снова покажет три экстента, несмотря на то, что от данных пусты полностью первые два. "Пустой хаост" "справа" от high watermark и "дыры" слева могут образовывать вместе значительные скрытые резервы табличного пространства (представьте себе, что рост таблицы EMP1 надолго прекратился; на это время 27 блоков останутся "замороженными"). Кроме того, большое число "дырок" может снижать эффективность работы с таблицей, о чем говорилось в статье " Возвращаем таблице вторую молодость ". И в том и в другом случае следует подумать: а не стоит ли таблицу пересоздать, возможно с новыми параметрами хранения (см. указанную статью). Схема использования хранимым объектом блоков Общая картинка распределения памяти в табличном пространстве выглядит примерно так:
Верхняя граница заполнения в Oracle может только расти - к сожалению для разработчика. По рисунку видно, что справа и слева от нее может образоваться много (как в примере выше) свободного места, которое по словарю-справочнику не увидишь. Прикинуть размер пропадающего пространства можно с помощью команды ANALYZE, однако это будет (а) примерная оценка и (б) анализ больших таблиц или большого их числа может потребовать у СУБД много ресурсов. Тем не менее в Oracle есть выход из создавшейся ситуации. "Заглянуть" внутрь экстентов быстро и эффективно можно с помощью двух процедур из системного пакета DBMS_SPACE. Пакет DBMS_SPACE Посмотреть длину списка свободных блоков (дальше будем считать, что для таблиц заведено по одному такому списку, что делается системой по умолчанию и представляет собой самый распространенный случай; а вообще-то, их можно заводить и больше) можно процедурой DBMS_SPACE.FREE_BLOCKS: SQL> SET SERVEROUTPUT ON 68 блоков - это большой список. Большие списки свободных блоков сами по себе не криминал. Но это индикатор того, что "слева" от high watermark у вас могло образоваться много свободного места. Дальнейшее исследование можно проводить с помощью ANALYZE. Узнать расположение самой верхней границы high watermark можно с помощью процедуры DBMS_SPACE.UNUSED_SPACE: SQL> DECLARE Видно, что справа от high watermark имеется 27 неиспользованных блоков. В нашем случае это чуть меньше трети размера всего сегмента с таблицей (96 блоков), то есть очень много. Сама отметка high watermark находится на пятом блоке последнего экстента в нашем сегменте, причем сам экстент находится в файле номер 3. Как этим можно пользоваться Основная ценность процедур пакета DBMS_SPACE во-первых, в том, что они, как было сказано, дают информацию о заполнении табличного пространства, отсутствующую в словаре-справочнике, и, во-вторых, делают это быстро. Анализ заполненности экстентов, типа приведенного выше, разумно сделать регулярным, составив для этого специальный сценарий и организовав регулярный запуск этого сценария (например, с помощью DBMS_JOB). Ниже приводится сценарий, который можно взять за основу. Он выдает справку для таблиц и индексов пользователя. DECLARE В этой тренировочной схеме SCOTT виден большой расход памяти впустую. Нужно помнить, что решение о реорганизации таблиц следует принимать с осторожностью: выбор разных размеров экстентов для разных объектов чреват фрагментацией табличного пространства. (Возникнет ли оно реально, зависит еще от характера использования таблиц). Увы, но это Сцилла и Харибда, которые предлагает Oracle. Надеюсь, что приведенный сценарий послужит отправной точкой для вашего творчества. Например, он не выдает полезную в этом случае информацию о табличных пространствах, где происходят потери памяти. Кроме того, при большом числе объектов разумно составить сценарий, который бы выдавал, к примеру, 10 объектов с наиболее "пустым" "хвостом" и 10 объектов с наибольшей длиной списка свободных блоков. Возможны и другие усовершенствования. |