Начальный экстент для таблицы выделяется только после вставки данных в табличное пространство локально управляемого пользователя - PullRequest
0 голосов
/ 23 октября 2018

В случае локально управляемого табличного пространства SYSTEM, когда объекты создаются в пользовательском табличном пространстве (которое также управляется локально), начальные экстенты выделяются только после вставки данных.

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

create tablespace lmt datafile 'df.f' size 5M extent management local;

conn scott/tiger

create table sample (id nuber) tablespace lmt;

select * from user_tables where table_name = 'SAMPLE'; 
  1. начальный экстент равен нулю, когда табличное пространство SYSTEM управляется локально
  2. начальный экстент имеет значение, когда табличное пространство SYSTEM управляется словарем

после вставки данныхначальный экстент выделяется в случае (1)

Это ожидаемое поведение?потому что, согласно документации Oracle, «Oracle выделяет пространство для начального экстента при создании объекта схемы»

1 Ответ

0 голосов
/ 23 октября 2018

Я думаю, что вы цитируете (точнее, слегка перефразируя) эту часть документации :

INITIAL

Укажите размер первого экстента объекта.Oracle выделяет пространство для этого экстента при создании объекта схемы....

Это еще не все.Таблицы могут быть созданы с отложенным созданием сегмента :

deferred_segment_creation

Используйте это предложение, чтобы определить, когда база данных должна создать сегмент (s) для этой таблицы:

  • SEGMENT CREATION DEFERRED: этот пункт откладывает создание сегмента таблицы, а также сегментов для любых столбцов больших объектов таблицы, любых индексов, созданных неявно как частьсоздание таблицы и любые индексы, впоследствии явно созданные в таблице - до тех пор, пока первая строка данных не будет вставлена ​​в таблицу....

  • SEGMENT CREATION IMMEDIATE: сегмент таблицы создается как часть этого оператора CREATE TABLE.

Это выглядитнапример, то, что вы видите, не имеет ничего общего с локальным управлением табличным пространством * 1038, как вы и предполагали, и это просто совпадение.Разница является значением по умолчанию для создания сегмента, которое контролируется параметром инициализации deferred_segment_creation.Из того, что вы показали, установлено значение TRUE в базе данных, которая имеет локально управляемое табличное пространство SYSTEM, и FALSE в базе данных, которая управляется этим словарем.

Вы можете получитьсогласованное поведение путем переопределения значения по умолчанию, либо для отсрочки создания:

create table sample (id number) segment creation deferred tablespace lmt;

Table SAMPLE created.

set null "(null)"
select initial_extent from user_tables where table_name = 'SAMPLE';

INITIAL_EXTENT
--------------
(null)              

, либо для немедленного создания:

create table sample (id number) segment creation immediate tablespace lmt;

Table SAMPLE created.

select initial_extent from user_tables where table_name = 'SAMPLE';

INITIAL_EXTENT
--------------
         65536

Или вы можете изменить параметры инициализации, чтобы они были такими же, конечно,но это больше работы и может повлиять на другой код, который принимает текущее поведение.

...