攻略1-6 在创建数据表时避免盘区分配延迟

问题描述

在安装一个具有数千张表和索引的应用时,每张表和索引都被设置为最初分配10 MB的磁盘存储空间。在将安装所用的DDL(Data Definition Language,数据定义语言)部署到生产环境中时,你希望尽快将数据库对象安装好。你认识到,如果每个对象都在创建时分配10 MB磁盘空间,将会花费一些时间来部署这些DDL。你想知道是否能够使用某种方法来告诉Oracle,直到有实际的数据插入表中时,再为每个对象初始化空间分配。

解决方案

推迟初始段生成的唯一办法就是使用Oracle Database 11g R2版本。在这个数据库版本(或更高版本)中,默认将表(以及相关索引)的物理空间分配推迟到第一条记录插入到表中时。举一个小小的例子就可以帮助说明这个概念。首先创建一张表:

enter image description here

上面的这些行为与以前的Oracle版本是完全不同的。在以前的版本中,创建一个对象时,会马上分配段以及相应的盘区。

注意 段空间的延迟分配同样也会应用于分区表和索引。在第一条记录插入之前也不会分配任何盘区。

工作原理

从Oracle Database 11g R2企业版(而不是其他版本,例如标准版)开始,对于在本地管理表空间中创建的未分区堆组织表,初始段的创建被推迟到第一条记录插入表中时。由于下面这些原因,你需要知道Oracle的推迟段创建特性。

 使具有大量表和索引的应用能够快速安装。这提升了安装速度,尤其是在具有几千个对象的时候。 
 作为数据库管理员,初始的空间使用报告可能会让你很疑惑,因为你看到没有为对象分配任何空间。 
 创建第一行数据耗费的时间比以前的版本稍长(因为现在Oracle在创建第一行数据时分配磁盘空间)。对于大多数应用,这种性能上的降低并不显著。 
 使用这个特性可能会产生不可预见的副作用(下面几段内容将就这个问题进行更多的阐述)。 
我们认识到要想利用这一特性,唯一的“解决方案”就是升级到Oracle Database 11g R2(企业版),但通常并不会马上考虑这样做。但是,我们感觉讨论这个特性非常重要,因为(当你使用最新的Oracle数据库版本时)终究会用到上面提到的那些特性。

可以将数据库初始参数DEFERRED_SEGMENT_CREATION设置为FALSE,将延迟段创建属性禁用。这个参数的默认值是TRUE。

还可以在创建表时控制延迟段创建行为。CREATE TABLE语句具有两个新的子句:SEGMENT CREATION IMMEDIATE和SEGMENT CREATION DEFERRED,例如:

enter image description here

必须要注意延迟段创建可能会有一些不可预见的副作用。例如,MOS文档1050193.1描述了可能会发生定义为从1开始的序列,但实际上从2开始。

并且,由于只有Oracle企业版支持延迟段创建特性,如果尝试导出(还没有创建段的)对象,然后导入到Oracle标准版环境中,就会报错:ORA-00439: feature not enabled。可能的变通办法包括设置ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE或创建表的时候使用SEGMENT CREATION IMMEDIATE。关于这个问题的更多细节,可以查看MOS文档1087325.1。

注意 初始化参数COMPATIBLE需要为11.2.0.0.0或以上版本,才能使用SEGMENT CREATION DEFERRED子句。

目录