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

1 ... 324 325 326 [ 327 ] 328 329 330 ... 469


Использование объектно-реляционных средств

1399

Итак, теперь в нашей таблице можно хранить до 25 пред]дущих адресов. Вопрос в том, что при этом происходит за кадром ? Обратившись к словарю данных, можно увидеть следующее:

tkyte@TKYTE816> select name, length

2 from sys.col$

3 where obj# = (select object id

4 from user objects

5 where object name = PEOPLE)

NAME

LENGTH

NAME

HOME ADDRESS

SYS NC00003$ SYS NC00004$ SYS NC00005$ SYS NC00006$ SYS NC00007$

WORK ADDRESS SYS NC00009$

SYS NC00010$ SYS NC00011$ SYS NC00012$ SYS NC00013$

PREVIOUS ADDRESSES 14 rows selected.

10 1

25 25 30

22 1

25 25 30 2 22 2940

Сервер Oracle добавил столбец размером 2940 байт для реализации массива VARRAY. Данн1е массива VaRRAY будут храниться тут же, в самой строке. При этом возникает интересный вопрос: что произойдет, если размер массива станет больше 4000 байт (это максимальный размер структурированного столбца, поддерживаемый сервером Oracle)? Если удалить столбец и пересоздать его как VARRAY(50), произойдет следующее:

tkyte@TKYTE816> alter table people drop column previous addresses 2 /

Table altered.

tkyte@TKYTE816> create or replace type Address Array Type

2 as varray(50) of Address Type

Type created.

tkyte@TKYTE816> alter table people add previous addresses

Address Array Type 2 /

Table altered.

tkyte@TKYTE816> select object type, object name,

2 decode(status,INVALID,*,)

3 tablespace name

4 from user objects a, user segments b

status.



1400

Глава 2 0

5 where a.object name - b.segment name

6 order by object type, object name

OBJECT TYPE OBJECT NAME

S TABLESPACE NaME

TABLE TYPE

TYPE BODY

SYS LOB000002 63 01C00014$$

PEOPLE

ADDRESS ARRAY TYPE

ADDRESS TYPE ADDRESS TYPE

DATA DATA

tkyte@TKYTE816> select name, length

NAME

from sys.col$

where obj# - (select object id

from user objects where object name

LENGTH

PEOPLE)

NAME

HOME ADDRESS SYS NC00003$ SYS NC00004$ SYS NC00005$ SYS NC00006$ SYS NC00007$ WORK ADDRESS SYS NC00009$ SYS NC00010$ SYS NC00011$ SYS NC00012$ SYS NC00013$ PREVIOUS ADDRESSES

14 rows selected.

10 1

25 25 30 2

22 1

25 30

22 3852

Как видите, теперь сервер Oracle автоматически создал большой объект. Если объем данных в массиве VARRAY не превышает примерно 4000 байтов, данные хранятся вместе со строкой (inline). Если же объем данных больше, массив VARRAY выносится из строки в сегмент большого объекта (как и любой большой объект).

Массивы VARRAY либо хранятся в строке как столбец типа RAW, либо (при достаточно большом объеме) как большой объект. Дополнительных ресурсов поддержки данных типа VARRAY (по сравнению с вложенной таблицей) надо очень мало, что делает массив VARRAY привлекательным методом хранения повторяющихся данных. Поиск по массиву VARRAY можно реализовать, преобразовав его данные в таблицу, что сделает его не менее гибким, чем вложенные таблицы:

tkyte@TKYTE816> update people

2 set previous addresses = Address Array Type(

3 Address Type(312 Johnston

Dr, null.



Использование объектно-реляционных средств

1401

6 7 8

1 row updated.

Bethlehem, PA, 18017), Address Type(513 Zulema St, Apartment #3 , Pittsburg, PA, 18123),

Address Type(840 South Frederick St, null, Alexandria, YA, 20654));

tkyte@TKYTE816> select name, prev.city, prev.state, prev.zip code

2 from people p, table(p.previous addresses) prev

3 where prev.state = PA;

NAME

CITY

ZIP CODE

Tom Kyte Tom Kyte

Bethlehem Pittsburg

PA PA

18017 18123

Существенное различие состоит в том, что при реализации с помощью вложенной таблицы можно создать индекс по столбцу STATE вложенной таблицы, и оптимизатор этот индекс использовал бы. В данном случае столбец STATE проиндексировать нельзя.

Итак, основные отличия вложенных таблиц от массивов переменной длины (R представлены в следующей таблице.

Вложенная таблица

VARRAY

Элементы массива не упорядочены. Данные из набора могут возвращаться совсем не в том порядке, в каком они туда вставлялись.

VARRAY - настоящие массивы. Данные после вставки остаются упорядоченными. В рассмотренном ранее примере данные добавлялись в конец массива. Это означает, что самый старый адрес идет в массиве первым, а последний по времени адрес находится в конце массива. При использовании внешней таблицы для упорядочения адресов по давности потребуется дополнительный атрибут.

Вложенные таблицы физически хранятся в виде пары родительской дочерней таблиц с суррогатными ключами.

Массивы VARRAY хранятся как столбец типа RAW или как большой объект. При этом для обеспечения их работы требуются минимальные дополнительные ресурсы.

Вложенные таблицы не имеют ограничения на количество хранящихся элементов.

Для массивов VARRAY при создании типа задается ограничение на количество хранящихся элементов.

Вложенные таблицы можно изменять (добавлять/изменять/удалять в них данные) с помощью языка SQL.

Массивы VARRAY необходимо изменять процедурно. Нельзя выполнять операторы вида:

INSERT INTO

TABLE (SELECT P.PREVIOUS ADDRESSES FROM PEOPLE P)

VALUES ...

как для вложенной таблицы. Для добавления адреса придется использовать процедурный код (см. пример ниже).



1 ... 324 325 326 [ 327 ] 328 329 330 ... 469

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