`

Oracle 11gR2新建空表不分配Segment

阅读更多

一、引言:

在看《收获,不止Oracle》的神奇,走进逻辑体系世界一章时,需要新建一张表查看Extents的情况,由于该书的环境是ORACLE10G的,因此新建空表以后立刻就分配Segment,而我使用的是Oracle11gR2,新建空表后没有立即分配Segment。这就是11GR2的新特性,延迟段创建,就是说从11GR2开始默认创建的表不会立即分配segment,不会占用磁盘空间,当第一条数据insert时才会分配空间。

二、实验模拟:

复制代码
SQL> select * from v$version;  
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0    Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create table testnew(id int primary key,name varchar2(10));  
 
Table created
 
SQL> create table testnew_IME(id int primary key,name varchar2(10)) segment creation immediate; 
 
Table created
 
SQL> create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred;  
 
Table created
 
SQL> select segment_name from user_segments where segment_name like 'TESTNEW%';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
TESTNEW_IME
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011192                   JACK
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW_IME';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011193                   JACK
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW_DEF';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011194                   JACK
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011192';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011193';
 
SEGMENT_NAME
--------------------------------------------------------------------------------
SYS_C0011193
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011194';
 
SEGMENT_NAME
--------------------------------------------------------------------------------
 
SQL> insert into testnew values(1,'anbob.com');  
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select segment_name from user_segments where segment_name like 'TESTNEW%';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
TESTNEW
TESTNEW_IME
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011192                   JACK
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011192';
 
SEGMENT_NAME
--------------------------------------------------------------------------------
SYS_C0011192
 
SQL> truncate table testnew;  
 
Table truncated
 
SQL> select segment_name from user_segments where segment_name like 'TESTNEW%';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
TESTNEW
TESTNEW_IME

SQL> conn /as sysdba
已连接。
SQL> create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred;  
create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred
*1 行出现错误:
ORA-14223: 此表不支持延迟创建段
复制代码

注意:
11gR2默认是使用segment creation deferred建立,新建的无记录表不分配segment,当insert第一条记录时分配段空间,不会因truncate而回收,并且在sys schema里不支持,exp也不会导出。

关于这个主要还是跟deferred_segment_creation参数有关,在11gR2中该参数的值为true,说明当创建对象(如表),初始没有数据,不会立即创建segment。

如果该参数设置为false,表明之后的创建的表,初始没有数据,会立即创建segment。

下面看一下它的效果:

复制代码
SQL> alter system set deferred_segment_creation=false;
 
System altered
 
SQL> create table jack(x int);
 
Table created

SQL> select segment_name,segment_type,extents,blocks from user_segments where segment_name='JACK';
 
SEGMENT_NAME                                                                     SEGMENT_TYPE          EXTENTS     BLOCKS
-------------------------------------------------------------------------------- ------------------ ---------- ----------
JACK                                                                             TABLE                       1          8
复制代码
分享到:
评论

相关推荐

    oracle11g不能导出空表的解决方式

    然而,在使用 exp 命令导出 Oracle 11g 数据库时,空表会出现错误,这是因为 Oracle 11g 默认对空表不分配 segment。为了解决这个问题,我们可以使用以下几种方法。 方法 1: 修改 deferred_segment_creation 参数 ...

    oracle 11g R2 exp无法导出空表的解决方法

    Oracle 11g R2 中新增的特性,使得 exp 无法导出空表,这是因为 11g R2 中有一个新特性,即当表无数据时,不分配 segment,以节省空间。这种情况下,使用 exp 命令无法导出空表。下面将介绍四种解决方法: 解决...

    ORACLE 11gR2新特性延迟段创建导致EXP导不出空表

    在Oracle 11gR2版本中,Oracle数据库引入了一个新的特性——延迟段创建(Deferred Segment Creation)。这个特性主要是为了优化空间管理,特别是在处理大量空表时,可以有效地避免不必要的磁盘空间占用。延迟段创建...

    oracle11g导出空表、少表的解决方案

    在 Oracle 11g 中,有一个新特性:当表无数据时,不分配 segment,以节省空间。这使得在通过 exp 导出时,无法导出没有分配 segment 的表。解决这个问题有两种情况: 情况一:数据库创建时 可以通过设置 deferred_...

    Linux 5.5 +oracle 11gR2 sqlplus error

    ### Linux 5.5 + Oracle 11gR2 SQL*Plus 错误解决方法 在使用 Linux 5.5 系统上安装并运行 Oracle 11gR2 数据库时,用户可能会遇到 SQL*Plus 启动失败的问题。具体错误信息为:“sqlplus:error while loading ...

    Oracle 11gR2 for RHEL6 安装手册含备份方案超详细-魏伟新版

    ### Oracle 11gR2 for RHEL6 安装手册含备份方案超详细解析 #### 一、系统环境概述 在本章节中,我们将会详细介绍Oracle 11gR2在RHEL6上的安装环境配置。为了确保Oracle数据库能够稳定运行,我们需要对操作系统...

    解决Oracle导出dmp文件空表导不出问题.docx

    首先,通过调整`deferred_segment_creation`参数的值,可以确保未来创建的空表能够在导出时不出现问题;其次,通过为现有空表手动分配存储空间,解决了历史遗留问题,使得所有表都能被正常导出。这种方法简单有效,...

    Oracle11g使用exp导出空表

    Oracle11g为提高性能和节省空间,默认情况下对空表不分配segment(即数据段),这就导致了在使用exp工具进行数据导出时,空表无法被导出。这个行为是受deferred_segment_creation参数控制的,当其设置为TRUE时,默认...

    解决oracle10以上版本导出空表失败的问题

    在Oracle 11g及以上版本中,用户可能会遇到在尝试导出空表时失败的问题,主要表现为出现"EXP-00011: table 不存在"的错误信息。这个问题是由于Oracle的一种优化策略,即在11g版本以后,默认情况下,新建的表不会立即...

    数据库oracle11g导出 空表

     ORACLE 11G中有个新特性,当表无数据时,不分配segment,以节省空间。 解决方法:  1)insert一行,再rollback就产生segment了  该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。 ...

    Oracle11G导入导出(imp和exp)少表解决方法

    在 Oracle 11G 中,默认情况下,空表不会被分配 segment,以节省空间。这意味着,当用户尝试导出空表时,exp 命令将无法完成导出任务。为了解决这个问题,有多种方法可以使用。 1. 插入一行数据再rollback 一种...

    Oracle11g使用exp导出空表方法

    然而,Oracle11g在设计时默认对空表不分配segment,因此在使用exp导出数据库时,空表不会被包含在导出文件中。这对于完整备份和恢复所有表的场景来说,可能是一个问题。下面,我们将详细讨论如何处理这个问题,以及...

    oracle 11g不能导出空表的解决方法

    在Oracle 11g数据库系统中,用户可能会遇到无法导出空表的问题,这主要与Oracle 11g引入的一个新特性有关,即deferred_segment_creation参数。这个参数默认为true,它的作用在于延迟段的创建。当这个参数启用时,...

    Oracle 11g R2 执行export导出时 空表无法导出原因及解决方法

    在 Oracle 11g R2 版本中,可能会出现空表无法导出的问题,这是由于deferred_segment_creation 参数的原因。解决这个问题可以使用三种方法:insert 一行再 rollback、设置 deferred_segment_creation 参数、强行修改...

    Oracle导出空表解决办法

    ### Oracle导出空表解决办法 #### 背景与问题描述 在Oracle数据库管理过程中,经常遇到的一个问题是无法导出空表。这种情况通常发生在使用`expdp`或`exp`命令进行数据导出时,如果表为空,则可能会遇到无法导出的...

    ORACLE EXP不能导出空表的原因分析及解决方法

    一、不能导出空表的原因1、Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出。 2、设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment。 在...

    Oracle 11G R2 用 exp 无法导出空表解决方法

    关于R2无法exp出空表的方法。考虑到节省空间,oracle11g r2不给空表分配segment,具体办法见附件。

    11g Oracle导出表不导出数据默认为空表的解决方法

    1、Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出。 2、设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment。 在sqlplus中,执行如下命令: ...

    Oracle11G导入导出(imp和exp)少表解决方法.docx

    然而,在11G R2 版本中,由于一个新特性,空表在没有数据的情况下不会分配 segment,导致无法通过 exp 导出。这个问题可以通过以下几种方法解决: 1. **插入并回滚数据**:向空表中插入一行数据,然后执行 rollback...

    Oracle11g维护培训课件(华为内部教材)

    - **业务连续性**:利用Oracle 11g的高可用性特性确保关键业务不间断运行。 - **数据安全性**:通过Oracle 11g提供的加密技术和访问控制策略保护敏感数据安全。 - **资源高效利用**:借助Oracle 11g的自动化管理工具...

Global site tag (gtag.js) - Google Analytics