0

对于本地管理的 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 会为初始范围分配空间”

4

1 回答 1

1

我认为您正在引用(或者更确切地说,稍微解释一下)这部分文档

最初的

指定对象的第一个范围的大小。当您创建模式对象时,Oracle 会为此范围分配空间。...

不过,这还不是全部。可以使用延迟段创建来创建表:

deferred_segment_creation

使用此子句确定数据库何时应为此表创建段:

  • SEGMENT CREATION DEFERRED:此子句延迟表段的创建——以及表的任何 LOB 列的段、作为表创建的一部分隐式创建的任何索引以及随后在表上显式创建的任何索引——直到插入第一行数据入表。...

  • SEGMENT CREATION IMMEDIATE:表段是作为该CREATE TABLE语句的一部分创建的。

正如您所怀疑的那样,您所看到的似乎与本地管理的表空间无关,SYSTEM这只是一个巧合。不同之处在于段创建的默认值,它由初始化参数 控制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

当然,或者您可以将初始化参数更改为相同,但这需要更多的工作,并且可能会影响其他假定当前行为的代码。

于 2018-10-23T15:47:42.673 回答