博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DEFERRED_SEGMENT_CREATION
阅读量:5896 次
发布时间:2019-06-19

本文共 4286 字,大约阅读时间需要 14 分钟。

deferred_segment_creation 延迟段创建是11.2的新特性, 当创建一个 空表或者空分区时,实际的表段table segment被延迟到第一行数据插入的时候。
该功能通过DEFERRED_SEGMENT_CREATION参数启用,默认为TRUE.
由DEFERRED_SEGMENT_CREATION启用的新的空间分配方式的优势在于:
若系统安装后存在大量空表,而这些空表将从不会加载任何数据;假设一个空表占用64k(db_block_size=8,一个extent)的空间,则若存在一万张这样的空表
就要消耗625M的空间
当应用程序初次安装需要创建大量空表时,因为延迟了数据段创建的过程,所以可以节约大量时间
当向这些空表或者空分区插入第一行数据时,对应的表、LOb字段和索引的segment段会被创建。
在段创建过程中,相关表上的游标将失效invalidation。 官方认为在这里游标失效对性能的影响很小。
而且需要注意的使用deferred_segment_creation=true的情况下,更应当注意表空间的使用率,说不定哪一天这些空表全被用上了,哪就有点老母鸡变鸭了。
可以通过dba_tables、dba_indexes视图的SEGMENT_CREATED 字段确定该对象的 段是否被创建了。
SQL> select distinct segment_created from dba_tables;
SEG
---
NO
YES
N/A
 
用户可以通过2种方式来控制段segment的创建:
1.通过在session/system级别设置 DEFERRED_SEGMENT_CREATION 参数:
SQL> alter system set DEFERRED_SEGMENT_CREATION=false;
System altered.
SQL> alter session set DEFERRED_SEGMENT_CREATION=false;
Session altered.
2. 通过创建表create table时指定SEGMENT CREATION子句来控制:
SEGMENT CREATION DEFERRED 若如此指定,则延迟段的创建,在11gR2中为默认表现
SEGMENT CREATION IMMEDIATE 若如此指定,则不会延迟段的创建,回归到11gR2之前的默认表现
注意对于 延迟段创建的表可以通过alter table..move来使之立即生成segment
但是目前无法做到控制相关依赖对象例如索引的段创建,这些从属对象继承他们父对象表的属性。
 
也可以通过alter table allocate extent来促使创建段:
SQL> conn maclean/oracle
Connected.
SQL>
SQL> create table mac_defer(t1 int) tablespace users;
Table created.
SQL> select segment_created from dba_tables where table_name='MAC_DEFER';
SEG
---
NO
SQL> alter table mac_defer allocate extent (size 1M);
Table altered.
SQL> select segment_created from dba_tables where table_name='MAC_DEFER';
SEG
---
YES
 
 
该deferred_segment_creation特性的缺点是:
1. 由于要在第一次INSERT或其他加载数据方式时才产生segment段,而段的创建需要在表空间上分配空间allocate space,若短期内
大量空表存在插入的需求,则可能在短期内出现空间分配争用
2. deferred_segment_creation引入了少量的BUG.
以下是11.2.0.3上存在的一些bug,部分在psu或者bp中修复了:
NB Bug Fixed Description
15866428 11.2.0.4, 12.1.0.0 ORA-14766 / ORA-14403 during concurrent partition maintenance
14252187 12.1.0.0 ORA-600 [qesmaGetTblSeg1] from deferred segment creation in RAC
13986244 11.2.0.3.BP14, 11.2.0.4, 12.1.0.0 Various ORA-600 seen with deferred segment creation in RAC
13611310 12.1.0.0 Parallel DML with LOBs fails with ORA-7445 [qesmaGetFromLocalOrQCCache]
12614714 11.2.0.4, 12.1.0.0 ORA-1950 occurs when executing DML after EXCHANGE PARTITION and DROP USER
13649031 11.2.0.3.4, 11.2.0.3.BP06, 11.2.0.4, 12.1.0.0 ORA-10637 occurs on SHRINK of a partitioned table with deferred segments
13497523 11.2.0.3.BP15, 11.2.0.4, 12.1.0.0 Errors from SQLLDR loads into non-partitioned tables with deferred segment creation
* 13326736 11.2.0.2.8, 11.2.0.2.BP18, 11.2.0.3.3, 11.2.0.3.BP05, 11.2.0.4, 12.1.0.0 Dictionary corruption / ORA-959 due to DROP TABLESPACE
12535346 11.2.0.3.3, 11.2.0.3.BP07, 12.1.0.0 ORA-7445 [kxccexi] using referential integrity constraints with deferred segments or interval partitions
12358753 12.1.0.0 INDEX_STATS has wrong values for ANALYZE of deferred segmentindexes
11930350 12.1.0.0 Deadlock / undetected FK violation from DML on REFERENCE partitioned table
建议:
1. 对于存在较多空表或空分区且存在空间压力的,对性能、响应时间没有太高要求的系统可以考虑使用该特性
2. 对对性能、响应时间有较高要求的库建议关闭该特性,deferred_segment_creation=false
 
SQL> show parameter defer
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
deferred_segment_creation boolean
TRUE
SQL>
SQL> create table Maclean_nonpartition ("OBJECT_ID" NUMBER) ;
表已创建。
SQL> create table Maclean_partition ("OBJECT_ID" NUMBER) partition by range(object_id)
2 (partition p1 values less than (99999) tablespace users,
3 partition p2 values less than (maxvalue) tablespace users);
表已创建。
SQL> select segment_name,partition_name from dba_segments where segment_name like '%MACLEAN%' and owner='MACLEAN';
未选定行
SQL> insert into Maclean_nonpartition values(1);
已创建 1 行。
SQL> insert into Maclean_partition values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select segment_name,partition_name from dba_segments where segment_name like '%MACLEAN%' and owner='MACLEAN';
SEGMENT_NAME PARTITION_NAME
------------------------------ ------------------------------------------------------------
MACLEAN_PARTITION P1
MACLEAN_NONPARTITION    
create table Maclean_nonpartition ("OBJECT_ID" NUMBER);
create table Maclean_partition ("OBJECT_ID" NUMBER) partition by range(object_id)
(partition p1 values less than (99999) tablespace users,
partition p2 values less than (maxvalue) tablespace users);
 

转载地址:http://xexsx.baihongyu.com/

你可能感兴趣的文章
从《硅谷传奇》看微软和苹果
查看>>
windows8 开发获得系统 app相关信息代码 c#版本
查看>>
【Android】7.1 布局控件常用的公共属性
查看>>
JAVASCRIPT变量的作用域
查看>>
springAop
查看>>
数字逻辑 第一章、编码 1.2 编 码
查看>>
如何搭建Nuget服务器
查看>>
图片自适应高度的问题
查看>>
CSS 设置table下tbody滚动条
查看>>
13-1 jQuery操作cookie
查看>>
2017-2018 20172309 《程序设计与数据结构(下)》第七章学习总结
查看>>
netbeans 调试 php
查看>>
js的事件流你真的弄明白了吗?
查看>>
sql 循环 ,随机数,循环插入一年数据
查看>>
快排模板(附求第k大的数)
查看>>
PAT L3-005. 垃圾箱分布
查看>>
BNU OJ 50998 BQG's Messy Code
查看>>
kibana连接elasticsearch集群做负载均衡
查看>>
逸鹏说道:性格色彩读后感
查看>>
eclipse快捷键(shift+ctrl+l能出来所有的快捷键)
查看>>