|
Программирование >> Oracle
теперь тоже можно создавать дополнительные индексы. Таблица, организованная в виде кучи, создается по умолчанию при выполнении оператора CREATE TABLE. Если необходимо создать таблицу другого типа, это надо явно указать в операторе CREATE. Куча - классическая структура данных, изучаемая в курсах программирования. Это по сути большая область пространства на диске или в памяти (в случае таблицы базы данных, конечно же, на диске), используемая произвольным образом. Данные размещаются там, где для них найдется место, а не в определенном порядке. Многие полагают, что данные будут получены из таблицы в том же порядке, в каком туда записывались, но при организации в виде кучи это не гарантировано. Фактически гарантировано как раз обратное: строки будут возвращаться в абсолютно непредсказуемом порядке. Это очень легко продемонстрировать. Создадим такую таблицу, чтобы в моей базе данных в блоке помещалась одна полная строка (я использую блоки размером 8 Кбайт). Совсем не обязательно создавать пример с одной строкой в блоке. Я просто хочу продемонстрировать предсказуемую последовательность событий. Такое поведение будет наблюдаться для таблиц любых размеров и в базах данных с любым размером блока: tkyte@TKYTE816> create table t 2 (a int, 3 b varchar2(4000) default rpad(*,4000,*), 4 с varchar2(3000) default rpad(*,3000,*) Table created. tkyte@TKYTE816> insert into t (a) values (1); 1 row created. tkyte@TKYTE816> insert into t (a) values (2); 1 row created. tkyte@TKYTE816> insert into t (a) values (3); 1 row created. tkyte@TKYTE816> delete from t where a = 2 ; 1 row deleted. tkyte@TKYTE816> insert into t (a) values (4); 1 row created. tkyte@TKYTE816> select a from t; A Если вы хотите воспроизвести этот пример, измените столбцы В и С в соответствии с размером блока. Например, при использовании блоков размером 2 Кбайт, столбец С не нужен, а столбец В должен быть типа VARCHAR2(1500) со стандартным значением 1500 звездочек. Поскольку данные в этой таблице организованы в виде кучи, при появлении свободного пространства оно используется повторно. При полном просмотре данные выдаются в том порядке, в котором обнаруживаются, а не в порядке вставки. Это принципиально важное свойство обычных таблиц базы данных; в общем случае они представляют собой неупорядоченные наборы данных. Учтите, что для получения подобного результата необязательно использовать оператор DELETE - тех же результатов можно достичь с помощью только операторов INSERT. Если вставить маленькую строку, потом - очень большую, которая не поместится в один блок с маленькой строкой, а затем - опять маленькую строку, при выборке эти строки вполне могут быть получены в порядке маленькая, маленькая, большая . Они не будут извлекаться в порядке вставки. Сервер Oracle размещает данные там, где они помещаются, а не в порядке выполнения транзакций. Если в результате запроса данные должны выдаваться в порядке вставки, придется добавить столбец, который будет использоваться для упорядочения данных при извлечении. Этот столбец может быть числовым, например, с последовательно увеличивающимися значениями (которые генерируются с помощью объекта SEQUENCE базы данных Oracle). Затем можно будет примерно воспроизвести последовательность вставки, упорядочивая данные по этому столбцу. Это будет лишь приближение, поскольку строка с последовательным номером 55 вполне могла быть зафиксирована в базе данных до строки с последовательным номером 54, поэтому официально она была в базе данных первой . Поэтому таблицу, организованную в виде кучи, можно рассматривать просто как большой неупорядоченный набор строк. Эти строки будут выдаваться во внешне случайном порядке, зависящем от используемых опций (параллельные запросы, различные режимы оптимизации и т.д.), причем могут выдаваться в разном порядке даже для одного и того же запроса. Никогда не полагайтесь на порядок строк в результатах запроса, если только запрос не включает конструкцию ORDER BY! Что еще важно знать о таблицах, организованных в виде кучи? Вообще-то, синтаксису оператора CREATE TABLE посвящено более 40 страниц в справочном руководстве по языку SQL, предлагаемом корпорацией Oracle, так что различных опций много. Опций настолько много, что разобраться со всеми весьма сложно. Одни только синтаксические ( рельсовые ) схемы занимают восемь страниц. Чтобы описать поддерживаемые опции оператора CREATE TABLE, я создам максимально простую таблицу, например: tkyteTKYTE816> create table t 2 (x int primary key , 3 у date, 4 z clob) Table created. Затем с помощью стандартных утилит экспорта и импорта данных (им посвящена глава 8), экспортирую определение таблицы и при импорте потребую показать полный текст оператора создания таблицы: exp userid=tkyte/tkyte imp userid=tkyte/tkyte tables=t full=y indexfile=t.sql В результате можно обнаружить, что в файле T.SQL содержится максимально подробный оператор создания соответствующей таблицы. Я его немного переформатировал для простоты чтения, но текст взят из файла, сгенерированного утилитой экспорта: CREATE TABLE TKYTE . Т { X NUMBER(*,0), Y DATE, Z CLOB) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 32768 NEXT 32768 MINEXTENTS 1 MAXEXTENTS PCTINCREASE 0 FREELISTS BUFFER POOL DEFAULT ) 4096 1 FREELIST GROUPS TABLESPACE TOOLS LOB ( Z ) STORE AS (TABLESPACE TOOLS ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10 NOCACHE STORAGE(INITIAL 32768 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER POOL DEFAULT)) ; ALTER TABLE TKYTE . T ADD PRIMARY KEY ( X ) USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 32768 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER POOL DEFAULT) TABLESPACE TOOLS ENABLE ; В этом тексте показаны многие опции оператора CREATE TABLE. Мне достаточно было только указать типы данных и имена столбцов, а детальную версию сервер Oracle втдал автоматически. Теперь можно отредактировать эту детальную версию, заменив, например, конструкцию ENABLE STORAGE IN ROW конструкцией DISABLE STORAGE IN ROW. Это отключит хранение данных больших объектов в строке вместе со структурированными данными и приведет к созданию отдельного сегмента. Я использую этот прием постоянно, чтобы сэкономить время на обдумывание больших синтаксических схем. Он также позволяет понять, какие опции оператора CREATE TABLE доступны в разных ситуациях.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |