table 的初始范围仅在本地管理用户 table 空间中插入数据后分配
Initial Extent for a table gets allocated only after data insertion in Locally managed user tablespace
在本地管理的系统 table 空间的情况下,当在用户 table 空间(也是本地管理的)中创建对象时,仅在数据插入后才分配初始范围。
而在 SYSTEM table 空间由字典管理的同一场景中,每当创建 table 时都会分配初始范围。
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';
- 当 SYSTEM table空间在本地管理时初始范围为空
- 当 SYSTEM table空间被字典管理时,初始范围具有价值
数据插入后,在情况(1)中分配初始范围
这是预期的行为吗?因为根据 Oracle 文档,'Oracle allocates space for initial extent when you create the schema object'
我认为你是在引用(或者更确切地说,稍微转述)this part of the documentation:
INITIAL
Specify the size of the first extent of the object. Oracle allocates space for this extent when you create the schema object. ...
但这还不是全部。可以创建表 with deferred segment creation:
deferred_segment_creation
Use this clause to determine when the database should create the segment(s) for this table:
SEGMENT CREATION DEFERRED
: This clause defers creation of the table segment — as well as segments for any LOB columns of the table, any indexes created implicitly as part of table creation, and any indexes subsequently explicitly created on the table — until the first row of data is inserted into the table. ...
SEGMENT CREATION IMMEDIATE
: The table segment is created as part of this CREATE TABLE
statement.
看起来您所看到的与本地管理的 SYSTEM
表空间无关,正如您所怀疑的那样,这只是巧合。不同之处在于段创建的默认设置,它由初始化参数 deferred_segment_creation
控制。根据您所展示的内容,在具有本地管理的 SYSTEM
表空间的数据库中设置为 TRUE
,而在具有该字典管理的数据库中设置为 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
当然,您也可以将初始化参数更改为相同,但这需要更多工作,并且可能会影响采用当前行为的其他代码。
在本地管理的系统 table 空间的情况下,当在用户 table 空间(也是本地管理的)中创建对象时,仅在数据插入后才分配初始范围。
而在 SYSTEM table 空间由字典管理的同一场景中,每当创建 table 时都会分配初始范围。
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';
- 当 SYSTEM table空间在本地管理时初始范围为空
- 当 SYSTEM table空间被字典管理时,初始范围具有价值
数据插入后,在情况(1)中分配初始范围
这是预期的行为吗?因为根据 Oracle 文档,'Oracle allocates space for initial extent when you create the schema object'
我认为你是在引用(或者更确切地说,稍微转述)this part of the documentation:
INITIAL
Specify the size of the first extent of the object. Oracle allocates space for this extent when you create the schema object. ...
但这还不是全部。可以创建表 with deferred segment creation:
deferred_segment_creation
Use this clause to determine when the database should create the segment(s) for this table:
SEGMENT CREATION DEFERRED
: This clause defers creation of the table segment — as well as segments for any LOB columns of the table, any indexes created implicitly as part of table creation, and any indexes subsequently explicitly created on the table — until the first row of data is inserted into the table. ...
SEGMENT CREATION IMMEDIATE
: The table segment is created as part of thisCREATE TABLE
statement.
看起来您所看到的与本地管理的 SYSTEM
表空间无关,正如您所怀疑的那样,这只是巧合。不同之处在于段创建的默认设置,它由初始化参数 deferred_segment_creation
控制。根据您所展示的内容,在具有本地管理的 SYSTEM
表空间的数据库中设置为 TRUE
,而在具有该字典管理的数据库中设置为 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
当然,您也可以将初始化参数更改为相同,但这需要更多工作,并且可能会影响采用当前行为的其他代码。