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

1 ... 82 83 84 [ 85 ] 86 87 88 ... 469


ми 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,t1

Sys,table.t2

Sys.table,t3

Sys,table,t4

Sys,table,t5

Sys,table,t6

Sys,table,t7

Sys,table,t8

Sys,table,t100

Sys,table,t101

Sys,table,t102

Sys,table,t103

можно использовать конструкцию COMPRESS 2 (факторизовать первых два столбца) и получить блок с такими данными:

Sys.table

t103

t104 ..

t300

t301

t302

t303

Т.е. значения 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.



1 ... 82 83 84 [ 85 ] 86 87 88 ... 469

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