|
Программирование >> Oracle
Использование объектно-реляционных средств 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 ... как для вложенной таблицы. Для добавления адреса придется использовать процедурный код (см. пример ниже).
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |