11gR2之前的版本中,当创建一张表时,会自动分配段空间,这样做有几个弊端:

1. 初始创建表时就需要分配空间,自然会占用一些时间,如果初始化多张表,这种影响就被放大。

2. 如果很多表开始的一段时间都不需要,那么就会浪费这些空间。

为此,从11gR2开始,有一种新特性,叫延迟段,即延迟分配段空间。简单讲,默认将表(以及索引、LOB)的物理空间分配推迟到第一条记录插入到表中时。即有实际的数据插入表中时,再为每个对象初始化空间分配。其中11.2.0.1不支持分区表 、bitmap join indexes和domain indexes。11.2.0.2版本开始支持分区表。

注:使用特性的前提是COMPATIBLE参数是11.2.0及以上。

实验:

1. 首先我们看下11g之前版本对表空间时段空间的分配:
SQL> select version from v$instance;
 VERSION
 -----------------
 10.2.0.4.0

SQL> create table tbl_seg(reg_id number, reg_name varchar2(200));
 Table created.

SQL> select count(*) from user_segments where segment_name='TBL_SEG';
   COUNT(*)
 ----------
          1

SQL> select count(*) from user_extents where segment_name='TBL_SEG';
   COUNT(*)
 ----------
          1

SQL> select segment_name, segment_type, bytes, blocks, extents, initial_extent, next_extent, max_extents
   2  from user_segments where segment_name='TBL_SEG';
 SEGMENT_NAME       SEGMENT_TYPE       BYTES     BLOCKS    EXTENTS INITIAL_EXTENT NEXT_EXTENT MAX_EXTENTS
 ----------------------------- ---------- ---------- ---------- -------------- ----------- --------------------- ----------------- ------------------
 TBL_SEG                   TABLE                     65536     8               1            65536                                       2147483645

可以看到,TBL_SEG表创建后,user_segments和user_extents已经有记录了,说明已经为TBL_SEG分配了段和区的空间。1个EXTENTS的大小是64K。

2、接下来看下11g的分配:

[oracle@riserver1 ~]$ sqlplus / as sysdba
 SQL*Plus: Release 11.2.0.1.0 Production on Mon Aug 4 07:53:24 2014
 Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 Connected to:
 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select version from v$instance;
 VERSION
 -----------------
 11.2.0.1.0

SQL> create table tbl_seg(reg_id number, reg_name varchar2(200));
 Table created.

SQL> select count(*) from user_segments where segment_name='TBL_SEG';
   COUNT(*)
 ----------
          1

SQL> select count(*) from user_extents where segment_name='TBL_SEG';
   COUNT(*)
 ----------
          1

为什么仍分配了呢?

IOTs and other special tables like clustered tables, global temporary tables, session-specific temporary tables, internal tables, typed tables, AQ tables, external tablesare not supported. Tables owned by SYS,SYSTEM, PUBLIC, OUTLN, and XDB are also excluded.

这里解释了原因,SYS的表是不能使用延迟段的,因此创建时还是立即分配段空间。

那么接下来使用非系统账户建表:

SQL> create user user01 identified by user01;

User created.

SQL> grant connect, resource to user01;
 Grant succeeded.

[oracle@riserver1 ~]$ sqlplus user01/user01
 SQL*Plus: Release 11.2.0.1.0 Production on Mon Aug 4 08:32:06 2014
 Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 Connected to:
 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show user
 USER is "USER01"

SQL> select username,default_tablespace from user_users;
 USERNAME                       DEFAULT_TABLESPACE
 ------------------------------ ------------------------------
 USER01                         USERS

SQL> create table tbl_seg(reg_id number, reg_name varchar2(200));
 Table created.

SQL> select count(*) from user_segments where segment_name='TBL_SEG';
   COUNT(*)
 ----------
          0

SQL> select count(*) from user_extents where segment_name='TBL_SEG';
   COUNT(*)
 ----------
          0

此时可以看到创建表后,段和区是没有分配空间的,那么插入记录:

SQL> insert into tbl_seg values(1, 'BRDSTN');

1 row created.

SQL> select count(*) from user_segments where segment_name='TBL_SEG';

COUNT(*)
----------
         1

SQL> select count(*) from user_extents where segment_name='TBL_SEG';

COUNT(*)
----------
         1

可以看到段和区已经分配了空间,user_segments和user_extents表均有了TBL_SEG对应的记录。

3. 禁用延迟段:
可以禁用延迟段,是否使用延迟段是由DEFERRED_SEGMENT_CREATION参数定义的,该参数可以在会话级别修改,如果想彻底删除延迟段,可以在spfile中修改,本次以及下次启动后就会一直生效了,例如:

SQL> alter session set DEFERRED_SEGMENT_CREATION=false;

Session altered.

SQL> create table tbl_seg(reg_id number, reg_name varchar2(200));
Table created.

SQL> select count(*) from user_segments where segment_name='TBL_SEG';
  COUNT(*)
----------
         1

SQL> select count(*) from user_extents where segment_name='TBL_SEG';
  COUNT(*)
----------
         1

4. 使用SEGMENT CREATION子句:
即使禁用了延迟段,还是可以使用SEGMENT CREATION在创建表时指定是否使用延迟段,例如:

SQL> create table tbl_seg(
  2  reg_id number,
  3  reg_name varchar2(200))
  4   segment creation immediate;
Table created.

SQL> select count(*) from user_segments where segment_name='TBL_SEG';
  COUNT(*)
----------
         1

SQL> select count(*) from user_extents where segment_name='TBL_SEG';
  COUNT(*)
----------
         1

这可以看到立即为段和区分配了空间。如果使用SEGMENT CREATION DEFERRED则会使用延迟段的功能。

5. 从USER_TABLES看变化:
11g的USER_TABLES比之前的版本会多一些字段,其中有一项就是SEGMENT_CREATED(VARCHAR2(3)),这样就能知道某个段是否已经分配了空间。

6. 导入导出的影响:

11.2.0.1版本下,如果某张表还未分配段,使用exp到导出时是不会导出未分配段的表,解决方法是可以在导出前使用ALLOCATE EXTENT手工分配段,或者使用数据泵expdp导出未分配段的表。

总结:

这种延迟段的新特性的好处是显而易见的,弊端也很明显,至于是否应该使用,则需要根据实际业务来决定,这也是Oracle提供了禁用延迟段选项的目的。

Oracle 11g新特性 -- 延迟段的更多相关文章

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

    下面测试Oracle 11g开始的新特性truncate的增强和延迟段空间创建. Oracle从11g开始,当用户创建一张空表的时候不会先分配段和空间,只有当对这张表插入第一行数据的时候才分配段和空间 ...

  2. Oracle 11g 新特性 – HM(Hang Manager)简介

    在这篇文章中我们会对oracle 11g 新特性—hang 管理器(Hang Manager) 进行介绍.我们需要说明,HM 只在RAC 数据库中存在. 在我们诊断数据库问题的时候,经常会遇到一些数据 ...

  3. Oracle 11g 新特性 --SQL Plan Management 说明

    Oracle 11g 新特性 --SQL Plan Management 说明 参见大神博主文章: http://blog.csdn.net/tianlesoftware/article/detail ...

  4. oracle 11g使用deferred_segment_creation 延迟段创建特性时遇到的问题总结

    总结,下面是两个问题.问题1是用户可以在所有表空间创建表;问题2是exp不能导出空表 问题1: 版本:oracle 11.2.0.1.0 select * from v$version; 创建用户aa ...

  5. 使用Oracle 11g新特性 Active Database Duplication 搭建Dataguard环境

    Duplication Database 介绍 Duplicate database可以按照用途分为2种: duplicate database(复制出一个数据库) duplicate standby ...

  6. Oracle 11g新特性

    文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...

  7. Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明(转载)

    一.自适应游标共享(Adaptive Cursor Sharing) 说明 1.1 ACS概述绑定变量使Oracle DB 可以为多条SQL 语句共享单个游标,以减少分析SQL 语句所使用的共享内存量 ...

  8. Oracle 11g 新特性(一)-- 虚拟列

    数据库版本: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Oracle11g 增加了虚拟列的新特性, 具体说明如 ...

  9. Oracle 11g新特性invisible index(不可见的索引)

    假设一张表上有十几个索引,你有什么感受?显然会拖慢增.删.改的速度.不要指望开发者能建好索引.我的处理方法是先监控非常长的一段时间.看哪些索引没实用到,然后删除. 但删除以后,假设发现某一天实用,那又 ...

随机推荐

  1. [ruby on rails] 深入(1) ROR的一次request的响应过程

    示意图 即: 1.  浏览器发起请求 2. Routes对请求进行一个url映射,交给对应的Controller来处理 3/4. Contoller从Model中获取数据(或者操作数据) 5. 返回给 ...

  2. 泛型约束 where T : class,new()

    假如有这样一个方法签名 public List<T> GetSomethingList<T> (int a,int b,string c) where T:class,new( ...

  3. Linux内核 TCP/IP、Socket参数调优

    Linux内核 TCP/IP.Socket参数调优 2014-06-06  Harrison....   阅 9611  转 165 转藏到我的图书馆   微信分享:   Doc1: /proc/sy ...

  4. linux下的shell运算(加、减、乘、除)

    linux下的shell运算(加.减.乘.除) 标签: linuxshell运算加减乘除 2014-03-12 16:25 15127人阅读 评论(0) 收藏 举报 分类: linux(17) ((i ...

  5. Docker内部存储结构(devicemapper)解析(续)

    dm.fs 参数dm.fs可以指定容器的rootfs的文件系统,但只支持ext4/xfs: func NewDeviceSet(root string, doInit bool, options [] ...

  6. ls常用选项总结

    参考: http://billie66.github.io/TLCL/book/index.html ls - List directory contents 选项 长选项 描述 -a --all 列 ...

  7. float 在内存中如何存储的

    float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准:    一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...

  8. dump、cpio、tar、dd四种备份工具比较

    原文  http://blog.csdn.net/ether_lai/article/details/12656219 dump dump可执行文件系统增量备份的存储操作 ,dump 可将目录或整个文 ...

  9. Match:Milking Grid(二维KMP算法)(POJ 2185)

    奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上 ...

  10. 关于C语言中的转义字符

    1.转义字符的分类 1. 1一般转义字符 这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符.常用的一般转义字符为: \a     \n     \t     \v     \b     \r ...