Программирование >>  Oracle 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 469


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

l f ree blks

number;

l total blocks

number;

l total bytes

number;

l unused blocks

number;

l unused bytes

number;

l LastUsedExtFileId

number;

l LastUsedExtBlockId

number;

1 LAST OSED BLOCK

number;

procedure get data

begin

dbms space.free blocks

(segment owner

=>

USER,

segment name

=>

segment type

=>

TABLE ,

FREELIST group id

= > 0,

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;

insert

FREELIST,

used

table

insert

FREELIST,

used

table

insert

FREELIST,

used

table

insert

FREELIST,

used

table

insert

FREELIST,

used

table

insert

FREELIST,

used

table

insert

FREELIST,

used

table

insert

FREELIST,

used

table

- между 7-й к 8-й строками

insert

FREELIST,

used

table

добавился еще один

insert

FREELIST,

used

table

используемый блок

insert

FREELIST,

used

table

update

FREELIST,

used

table

update

FREELIST,

used

table

update

FREELIST,

used

table

update

FREELIST,

used

table

update

FREELIST,

used

table

- четвертое изменение

update

FREELIST,

used

table

возвращаетблок в список

update

FREELIST,

used

table

свободных

update

FREELIST,

used

table

update

FREELIST,

used

table

update

FREELIST,

used

table

update

FREELIST,

used

table

PL/SQL

procedure

successfully completed.

Понятно, что после семи вставок в таблицу добавляется еще один блок. Аналогично, после четырех изменений, количество блоков в списке FREELIST увеличивается с 1 до 2 (оба блока опять находятся в списке свободных - в них можно вставлять строки). Если удалить и пересоздать таблицу Т с другими установками и выполнить измерение еще раз, мы получим следующее:



1 ... 77 78 79 [ 80 ] 81 82 83 ... 469

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика