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

1 ... 84 85 86 [ 87 ] 88 89 90 ... 469


INCLUDING Y

OVERFLOW PCTFREE 10 PCTUSED 4 0 INITRANS 1 MAXTRANS 255 LOGGING

STORAGE ( INITIAL 32768 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 4096

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER POOL DEFAULT )

TABLESPACE TOOLS ;

Итак, осталось разобраться с параметрами PCTTHRESHOLD, OVERFLOW и

INCLUDING. Они взаимосвязаны и позволяют обеспечить более эффективное хранение данных в листовых блоках индекса (именно в этих блоках и хранятся фактические данные индекса). Индекс обычно создается по подмножеству столбцов таблицы. Обычно в блоке индекса помещается во много раз больше строк, чем в блоке таблицы, организованной в виде кучи. Эффективность индекса зависит от возможности хранить в блоке много строк; в противном случае серверу Oracle придется тратить много времени на поддержку структуры индекса, ведь каждый оператор INSERT или UPDATE при этом может приводить к делению индексного блока, чтобы он мог вместить новые данные.

Конструкция OVERFLOW позволяет задать другой сегмент, дополнительный сегмент, в который помещаются данные строк организованной по индексу таблицы, когда они становятся слишком большими. Обратите внимание, что для сегмента OVERFLOW опять можно задавать параметр PCTUSED. Параметры PCTFREE и PCTUSED для сегмента OVERFLOW имеют такое же значение, что и для таблицы, организованной в виде кучи. Условия использования дополнительного сегмента можно задавать двумя способами.

С помощью конструкции PCHRESHOLD. Когда объем данных в строке превзойдет этот процент от размера блока, хвостовые столбцы такой строки будут храниться в дополнительном сегменте. Итак, если параметр PCTTHRESHOLD имеет значение 10 процентов, а размер блока - 8 Кбайт, любая строка размером более 800 байт будет частично храниться в другом месте, вне блока индекса.

С помощью конструкции INCLUDING. Все столбцы строки, вплоть до столбца, порядковый номер которого указан в конструкции INCLUDING, хранятся в блоке индекса, а остальные столбцы - в дополнительном сегменте.

Предположим, имеется таблица в базе данных с размером блока 2 Кбайт:

ops$tkyte@ORA8I.WORLD> create table iot

2 (x int,

3 у date,

4 z varchar2 (2000) ,

5 constraint iot pk primary key (x)

7 organization index

8 pctthreshold 10

9 overflow

10 /

Table created.

Графически ее можно представить так:




Серые прямоугольники - это записи индекса, часть большей индексной структуры (в главе 7, посвященной индексам, вы увидите более детальную схему структуры индекса). Если коротко, структура индекса - дерево, а листовые блоки (в которых хранятся данные) фактически образуют двухсвязный список, упрощающий последовательный просмотр блоков. Белый прямоугольник представляет дополнительный сегмент, в нем будут храниться данные, превосходящие устанавливаемый параметром PCTTHRESHOLD предел. Сервер Oracle будет просматривать столбцы в обратном порядке, начиная с последнего столбца строки и заканчивая последним столбцом первичного ключа (но не включая его), чтобы определить, какие столбцы надо хранить в дополнительном сегменте. В нашем примере числовой столбец X и столбец типа даты Y всегда будут помещаться в блоке индекса. Последний столбец, Z, имеет переменную длину. Когда его длина составляет менее 190 байт (10 процентов от блока размером 2 Кбайт - это около 200 байт, но надо вычесть 7 байт для даты и от 3 до 5 - для числа), он будет храниться в блоке индекса. Когда же его длина превысит 190 байт, сервер Ocle будет хранить данные столбца Z в дополнительном сегменте, и добавит указатель на них в блок индекса.

Еще можно использовать конструкцию INCLUDING. Она позволяет явно указать, какие столбцы должны храниться в блоке индекса, а какие - в дополнительном сегменте. Для следующей таблицы:

ops$tkyte@ORA8I.WORLD> create table lot

2 (x int,

3 у date,

4 z varchar2(2000) ,

5 constraint iot pk primary key

7 organization index

8 including у

9 overflow 10 /

Table created.



можно ожидать такую структуру:

1,01-JAN-01, <указатель> 2,01-JAN-01,<указатель> 3,01-JAN-01,<указатель>

4,01-JAN-01,<указатель> 5,01-JAN-O1 ,<указатель> ,-------[. 6,01 -JAN-01 ,<указатель>

n байтов данных

n байтов данных

n байтов данных

n байтов данных

n байтов данных

n байтов данных

В этом случае столбец Z, независимо от объема содержащихся в нем данных, будет храниться вне строки , в сегменте остатка.

Что же лучше использовать, PCTTHRESHOLD, INCLUDING или комбинацию обоих параметров? Это зависит от потребностей. Если имеется приложение, всегда или почти всегда использующее первые четыре столбца таблицы и лишь изредка обращающееся к последним пяти столбцам, имеет смысл применять конструкцию INCLUDING. В индекс включаются столбцы до четвертого включительно, а остальные пять будут храниться отдельно. Если в процессе работы они понадобятся, то будут выбраны аналогично перенесенным или фрагментированным строкам. Сервер Oracle прочитает начало строки, найдет указатель на остаток строки, а затем прочитает и его. Если же с определенностью нельзя сказать, что преимущественно обращаются именно к этим столбцам и лишь изредка - к остальным, имеет смысл подумать об использовании параметра PCHRESHOLD. Установить подходящее значение параметра PCHRESHOLD легко, если определить, сколько строк в среднем желательно хранить в блоке индекса. Предположим, необходимо хранить в индексном блоке 20 строк. Это означает, что каждая строка должна занимать 1/20 (5 процентов) блока. Параметр PCTTHRESHOLD должен иметь значение 5; каждый фрагмент строки, хранящийся в листовом блоке индекса, должен занимать не более 5 процентов блока.

И последнее, о чем следует поговорить, завершая рассмотрение таблиц, организованных по индексу, - индексация. Можно создавать индекс по индексу, если только первичный индекс представляет собой таблицу, организованную по индексу. Созданные таким образом индексы называются вторичными. Обычно индекс содержит физический адрес строки, на которую ссылается, в виде идентификатора строки. Вторичный индекс организованной по индексу таблицы не может использовать физические адреса; для сстлки на строку необходим другой способ. Дело в том, что строка в таблице, организованной по индексу, может часто перемещаться, причем она не переносится как строка в обычной таблице. Строка в таблице, организованной по индексу, должна находиться в определенном месте индексной структуры, которое определяется ее первичным клю-



1 ... 84 85 86 [ 87 ] 88 89 90 ... 469

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