|
Программирование >> Oracle
266 Глава 6 Установка значений PCTFREE и PCTUSED Установка значений параметров PCTFREE и PCTUSED - важная тема, которой не всегда уделяется должное внимание. Я хочу продемонстрировать, как можно оценить дисковое пространство, используемое объектами схемы. Я буду использовать хранимую процедуру, демонстрирующую последствия вставки в таблицу данных при различных значениях параметров PCTFREE/PCTUSED, после чего выполняется ряд изменений одних и тех же данных. Это покажет, как эти параметры могут повлиять на количество блоков, доступных в списке FREELIST (что, в конечном итоге, влияет на использование пространства, количество перенесенных строк и т.д.). Предлагаемые сценарии - иллюстративные; они не определяют оптимальные значения параметров. Их можно использовать, чтобы разобраться, как сервер Oracle работает с блоками при выполнении различных изменений. Для эффективного использования эти шаблоны сценариев придется изменить. Я начну с создания тестовой таблицы: tkyte@TKYTE816> create table t (x int, у char(1000) default x); Table created. Она очень проста, но для демонстрации прекрасно подойдет. Использование типа CHAR гарантирует, что все строки с непустым значением в столбце Y будут иметь длину чуть более 1000 байт. Поэтому можно предположить, что будет происходить с блоками определенного размера. Теперь представлю процедуру для оценки списка FREELIST и использования пространства в блоке: tkyte@TKYTE816> create or replace procedure measure usage 2 as 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23
free blks => l free blks); dbms space.unused space (segment owner => USER, 24 25 26 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 4 6 47 48 49 50 51 52 53 54 55 56 57 segment name segment type total blocks total bytes unused blocks unused bytes = > T, => TABLE, => i total blocks, => l total bytes, => l unused blocks, => l unused bytes, IAST USED EXTENT FILE ID => l LastOsedExtFileId, IAST USED EXTENT BLOCK ID => l LastUsedExtBlockId, LAST USED BLOCK => l last used block); dbms output.put line(L free blks on FREELIST, to char(1 total blocks-l unused blocks-l) used by table) ; end; begin for i in 0 . . 10 loop dbms output.put(insert get data; insert into t (x) values commit; end loop ; to char(i,00) (i) ; for i in 0 . . 10 loop dbms output.put(update get data; update t set у = null where x = commit; end loop; to char(i,00) end; Procedure created. Здесь мы используем две подпрограммы пакета DBMS SPACE, информирующие о том, сколько блоков находится в списке FREELIST сегмента, сколько - выделено таблице, сколько - не используется и т.д. С помощью этой информации можно определить, сколько используемых таблицей блоков (до отметки максимального уровня таблицы) находятся в списке FREELIST. Затем я вставляю в таблицу 10 строк с непустым значением в столбце Y. После этого построчно изменяю столбец Y так, чтобы он имел значение Null. С учетом того, что размер блока базы данных - 8 Кбайт, при стандарт-н1х значениях PCTFREE - 10 процентов и PCTUSED - 40 процентов можно ожидать, что семь строк свободно поместятся в блок (представленный ниже расчет сделан без учета служебных областей в блоке/строке): (2+1) байт для X + (1000+2) байт для Y = 1005 1005 байт/строку * 7 строк = 7035 8192 - 7035 байт (размер блока) = 1157 байт Остается 1157 байт, что недостаточно для еще одной строки плюс чуть больше 800 байт (10% блока) Поскольку 10 процентов от блока размером 8 Кбайт составляет немногим более 800 байт, понятно, что еще одна строка в блок не поместится. При желании можно точно рассчитать размер заголовка блока; здесь мы лишь предположили, что он поместится в 350 с небольшим байтах (1157 - 800 = 357). Это позволяет разместить в блоке семь строк. Затем определим, сколько изменений понадобится, чтобы блок вернулся в список FREELIST. Мы знаем, что для этого блок должен использоваться менее чем на 40 процентов, т.е. для возврата в список свободных в блоке может использоваться не более 3275 байт. Тогда, если при выполнении каждого оператора UPDATE освобождается 1000 байт, для возвращения блока обратно в список FREELIST потребуется выполнить примерно четыре оператора UPDATE. Ну что же, давайте посмотрим, насколько хорошо я посчитал: tkyte@TKYTE816> exec measure usage;
Понятно, что после семи вставок в таблицу добавляется еще один блок. Аналогично, после четырех изменений, количество блоков в списке FREELIST увеличивается с 1 до 2 (оба блока опять находятся в списке свободных - в них можно вставлять строки). Если удалить и пересоздать таблицу Т с другими установками и выполнить измерение еще раз, мы получим следующее:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |