|
Программирование >> Oracle
ми EXP/IMP, чтобы увидеть детали. Если начать с трех простейших разновидностей таблицы, организованной по индексу: tkyte@TKYTE816> create table t1 2 (x int primary key, 3 у varchar2(25) , 4 z date 6 organization index; Table created. tkyte@TKYTE816> create table t2 2 (x int primary key, 3 у varchar2(25) , 4 z date 6 organization index 7 OVERFLOW; Table created. tkyte@TKYTE816> create table t3 2 (x int primary key, 3 у varchar2(25) , 4 z date 6 organization index 7 overflow INCLUDING y; Table created. Прежде чем обсуждать ключевые слова OVERFLOW и INCLUDING, давайте сначала рассмотрим полный текст SQL-оператора, необходимого для создания первой из представленных выше таблиц: CREATE TABLE TKYTE . T1 (X NUMBER(*,0) , Y VARCHAR2 (25) , Z DATE, PRIMARY KEY ( X ) ENABLE ORGANIZATION INDEX NOCOMPRESS PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING STORAGE ( INITIAL 32768 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER PO0L DEFAULT TABLESPACE TOOLS PCTTHRESHOLD 50 ; Добавились две новые опции - NOCOMPRESS и PCTTHRESHOLD. Мы их вскоре рассмотрим. Возможно, вы обратили внимание, что в тексте оператора CREATE TABLE чего-то не хватает; конструкции PCTUSED нет, a PCTFREE - есть. Это потому, что индекс - сложная структура данных, организованная не случайным образом, как куча, а так, чтобы данные попали в определенное место. В отличие от кучи, где блоки доступны для вставки время от времени, блоки индекса всегда доступны для вставки новых записей. Если данные принадлежат определенному блоку в соответствии со значением ключа, они попадут в него независимо от степени его заполнения. Кроме того, параметр PCTFREE используется только при создании объекта и наполнении данными индексной структуры. В таблицах, организованных в виде кучи, он используется иначе. Параметр PCTFREE резервирует пространство во вновь созданном индексе, но не для последующих операций с ним (во многом, по той же причине, почему вообще не используется параметр PCTUSED). Все соображения относительно списков свободных блоков FREELIST, высказанные для таблиц, организованных в виде кучи, относятся и к таблицам, организованным по индексу. Теперь перейдем к новой опции NOCOMPRESS. Эта опция используется для индексов. Она требует, чтобы сервер Oracle хранил все значения в записи индекса (не сжимал ее). Если первичный ключ объекта создан по столбцам А, В и С, будут храниться все комбинации А, В и С. Противоположностью NOCOMPRESS является опция COMPRESS N, где N - целое число, задающее количество сжимаемых столбцов. В результате удаляются повторяющиеся значения; они факторизуются на уровне блоков, так что повторяющиеся значения столбца А и, возможно, В, больше не хранятся. Рассмотрим пример таблицы: tkyte@TKYTE816> create table iot 2 (owner, object type, object name, 3 primary key(owner,object type,object name) 5 organization index 6 NOCOMPRESS 7 as 8 select owner, object type, object name from all objects Table created. Значение в столбце OWNER повторяется много сотен раз. Каждой схеме (OWNER) обычно принадлежит множество объектов. Даже пара значений OWNER, OBJECTTYPE повторяется многократно; в схеме имеются десятки таблиц, десятки пакетов и т.д. Не повторяются только все три столбца вместе. Можно попросить сервер Oracle убрать повторяющиеся значения. Вместо создания индексного блока со значениями:
Т.е. значения SYS и TABLE сохраняются лишь один раз, а затем - только значения третьего столбца. При этом в блок индекса может поместиться намного больше записей. При этом ни степень параллелизма, ни функциональные возможности никак не ограничиваются. Требуется чуть больше процессорного времени, поскольку сервер Oracle выполняет дополнительные действия, чтобы собрать значения ключей. Однако при этом существенно сокращается объем данных при вводе/выводе, а в буферном кэше помещается больше данных, поскольку их больше помещается в блоке. Это очень хороший компромисс. Мы продемонстрируем экономию с помощью простого тестового примера, в котором создадим представленную ранее таблицу (CREATE TABLE AS SELECT) с параметрами NOCOMPRESS, COMPRESS 1 и COMPRESS 2. Начнем с процедуры, показывающей использование пространства таблицей, организованной по индексу: tkyte@TKYTE816> create or replace 2 3 4 5 9 10 11 12 13 14 15 16 17 18 19 20 21 procedure show iot space (p segname in varchar2) as l segname varchar2(30); l total blocks l total bytes l unused blocks l unused bytes l LastUsedExtFileId l LastUsedExtBlockId l last used block begin select SYS IOT TOP into l segname from user objects where object name number; number; number; number; number; number; number; object id upper(p segname); dbms space.unused space (segment ow}ner => user, segment name => l segname.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |