工作之:oracle 11g deferred_segment_creation段延迟创建(转载他人)

oracle 11g 新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true。具体是什么意思呢?
如果这个参数设置为true,你新建了一个表T1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,只有当你insert数据后才分配空间。这样可以节省少量的空间。

一、问题提出:
这带来一个问题:如果你通过EXP命令来导出整个用户时,你会发现所有没有数据的表都导不出来。如何解决这个问题呢?
二、问题分析:
1、既然新建的表没有分配extent,那么在user_segments视图中必然查不到,但是在user_tables中一定是能查到的,这样我们只要找到user_tables中有的,并且user_segments中没有的表,就能找出来哪些表是没有创建extent的。
select *
from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = ‘TABLE‘);
2、找出来后,可以通过alter table xxx allocate extent 语句来让其立即分配extent,这样就可以导出了,例如:
alter table t1 allocate extent (size 64k);
三、问题解决:
1、为了一次性批量把所有这样的“空表”都解决,可以通过批量sql实现:
select ‘alter table ‘ || table_name || ‘ allocate extent(size 64k);‘ sql_text,
table_name,
tablespace_name
from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = ‘TABLE‘);

2、然后把sql_text列在sqlplus中执行一下,就可以通过exp导出了。
3、当然,每次导出都这样做实在是太麻烦了,你完全可以将deferred_segment_creation参数调为false,这样调整后建的表都会立即分配空间,但是调整前的表都不会改变,因此还需要用1、2提到的办法解决。
--调整deferred_segment_creation为false的语法:
conn /as sysdba
alter system set deferred_segment_creation=false;
--如果还想调回来:
conn /as sysdba
alter system reset deferred_segment_creation;

--检查测试数据库:

show parameters deferred_segment_creation;

四、注意事项:
1、现在网上提到的办法都是先往表中间insert 一条数据,然后再rollback,使之分配空间,这种办法比较笨,不推荐。
2、通过move的办法也能得到相同的效果,但也不推荐。

时间: 2024-08-28 13:19:43

工作之:oracle 11g deferred_segment_creation段延迟创建(转载他人)的相关文章

Oracle 11g新特性延迟段创建和truncate的增强

下面测试Oracle 11g开始的新特性truncate的增强和延迟段空间创建. Oracle从11g开始,当用户创建一张空表的时候不会先分配段和空间,只有当对这张表插入第一行数据的时候才分配段和空间. 这就解决了有很多表是空的但是占用大量的磁盘空间.   测试11g延迟段创建和truncate 用户下有一张新表 SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- -----

oracle 11g导出少了空表,原因分析

oracle 11g导出少了空表 使用exp命令的时候,会出现少表的情况,是因为在11g版本中如果一个表里面是空的,为了节省空间,默认是不会给这个表分配空间的,在导出的时候也就不会将空表导出的,自然导入到另一个库里的时候会出现少表的情况.但缺少的表虽然里面没有数据,但有时候还是会影响到应用程序的执行,所以得把所有表都得导出来. 所以在正常导出表时,请一定要注意. 原因分析: 由于oracle 11g新增了一个参数: "deferred_segment_creation" "段

Oracle 11g不能导出空表的多种解决方法

空表不能导出的问题: 查资料发现Oracle 11g中有个新特性:新增了一个参数"deferred_segment_creation"含义是段延迟创建,默认是true. 具体是什么意思呢? deferred_segment_creation,即建立表的时候,这个表不会立即分配extent,也就是不占数据空间,即表也不分配segment以节省空间.直接在字典中记录了数据结构.而只有当真正有数据的时候才分配空间.这种方法对于象SAP这样大的系统需要部署成千上万张表是非常有效的.默认是开启的

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

在oracle 11g r2中,发现传统的exp居然不能导出空的表,然后查询一下, 发现需要如下的步骤去搞,笔记之. oracle 11g 新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true.具体是什么意思呢? 如果这个参数设置为true,你新建了一个表T1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,只有当你insert数据后才分配空间.这样可以节省少量的空间. 解决办法 1 设置deferred_segme

Oracle 11g 学习3——表空间操作

一.表空间概述 表空间是Oracle中最大的逻辑存储结构,与操作系统中的数据文件相对应: 基本表空间:一般指用户使用的永久性表空间,用于存储用户的永久性数据 临时表空间: 主要用于存储排序或汇总过程中产生的临时数据: 大文件表空间:用于存储大型数据(例如LOB) 非标准数据块表空间:用于在一个数据库实例中创建数据块大小不同的表空间: 撤销表空间:用于存储事务的撤销数据,在数据恢复时使用. 二.创建表空间 语法: CREATE [ TEMPORARY | UNDO ] TABLESPACE tab

Oracle 11g Data Guard 使用duplicate from active database 创建 standby database

用这种方式来搭建DG ,主库的停机时间很少,只需要重启一下,使参数生效.也可以用这种方法进行DB迁移.DG搭建好,然后把备库激活就可以了. 这样整个迁移中宕机时间也比较短. Oracle 11g的pyhsical standby 支持open read only 下的apply和Real-time query. 因此就有了physical standby 稳定和logical standby 的报表查询功能. Oracle: 11.2.0.1 OS: redhat 5.5 Primary IP:

oracle 11g 分区表创建(自动按年分区)

前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不过得在创建表时就设置好分区. 如果已经存在的表需要改分区表,就需要将当前表 rename后,再创建新表,然后复制数据到新表,然后删除旧表就可以了. 一.为什么要分区(Partition) 1.一般一张表超过2G的大小,ORACLE是推荐使用分区表的. 2.11g 中的分区表新特性:Partition

oracle 11g rac dbca建库时提示创建监听

Oracle 11g rac dbca建库时提示创建监听 在安装oracle 11g rac时,使用dbca建库的过程中提示需要创建监听: Default Listener "LISTENER" is not configured in Grid Infrantructure home.Use NetCA to configure Default Listener and return DBCA 解决步骤如下 因为oracle 11g rac在安装过程中会自动创建监听,无需手动创建,首

基于RHEL 6.5安装Oracle 11g详细教程(1)——创建虚拟机

前 言 环境说明: 在本次实验当中,主要是实现基于RHEL 6.5 64bit系统成功安装Oracle 11g R2 64bit,实验平台基于VMware vSphere. 介质下载: VMware ESXi 5.5.0(1331820) 下载链接:http://yunpan.cn/QiBnp2xxpFjaD 访问密码 2ec0 Redhat Enterprise Linux 6.5 x86_64 下载链接:http://yunpan.cn/QiBXcFF5SXvBj 访问密码 467f Ora