oracle11gR2新特性之四--存储方面的改进

经过前几篇特性的简述,这里就直入主题了。呵呵

l

首先,从磁盘说起,这个可以说是存储的底层啊,在R2中,支持4k大小的sector disk,针对高性能、高吞吐量的要求,现在磁盘的性能要求也在提高。目前,通常情况下都是512byte大小的sector。这里说起了sector size,那么这跟oracle有什么关系呢?接下来,将简述下它们之间的关系。

oracle使用asm管理diskgroup之后,势必会将datafile/controlfile/online log。。。存入diskgroup,在这时就产生了针对不同类型的文件,会对应不同的blocksize,如controlfileblocksize16klog文件是512byte(磁盘的sector size512byte,而当使用文件系统来存放log文件的话,会根据文件系统的blocksize来决定log文件的blocksize大小是多少,像windowlinux一般都是使用4k大小的数据页),datafileblocksize就根据数据库blocksize来决定了(或者说是创建表空间是指定的blocksize),由于log文件具有这种特殊性,所以一旦将oracle从具有512 byte sector size大小的disk迁移到具有4k sector size大小的disk时,需要着重考虑,在迁移库时应该重新创建几组log,在mount阶段切换几组log,从而可以在open之前,替换掉之前的log,因为在4k sectordisk上是不能兼容具有512byte大小的log文件。Controlfile就不一样了,由于是16k块大小的,所以4k对它来说还是没问题的。

l

其次,谈下关于表的压缩。在11gR2中支持传统的DMLinsert/update/delete)的压缩,语法也稍有变化。11gR2之前针对表的压缩,语法是compress for all operationscompress for direct_load operations,在11gR2以后实际的压缩选项只有compress [basic]compress for oltp两种。而针对oltp的压缩也采用了新的压缩算法(批量压缩),以便减小写的负载。下图展示的是压缩思路:

依据上图可以得知,传统的DML操作,采用的应该是这种压缩方式,而如果此表已经创建,而且是NOCOMPRESS表,表中已经有了部分数据,此时想要将该表变更为压缩表,可以用alter命令来转换,但表中的数据就不能被压缩了,而随后进来的数据是可以被压缩的。为什么说上图是说针对传统的DML操作的压缩呢,是因为有下面这几种直接压缩数据的方式:

Compression can occur while data is being inserted, updated, or bulk loaded into a table. Operations that permit compression include Single-row or array inserts and updates ,and the following direct-path insert methods:

1)        Direct path SQL*Loader

2)        CREATE TABLE AS SELECT statements

3)        Parallel INSERT statements

4)        INSERT statements with an APPEND or APPEND_VALUES hint

那么我们到底该选择用哪种方式来压缩呢?是basic还是for oltp,这个可以参考下图:

具体压缩效果的试验在此就不列出了。可以参考http://dbwriter.itpub.net/post/42818/513378这个帖子。

注意,在使用表压缩技术的同时还有几点限制:

1)        压缩表中的列不能超过255个字段;

2)        压缩表不能是IOT表;

3)        压缩表不能作为外部表或者cluster的一部分;

关于表压缩的如果有什么理解错的地方,还请指点一下。

l

还有就是新引入的参数:deferred_segment_creation。该参数表明了创建segment时,是否延迟创建,如下示例:

SQL> show parameter segment

NAME                                TYPE       VALUE                        

------------------------------------ ----------- ------------------------------

deferred_segment_creation           boolean    TRUE                         

rollback_segments                   string                                   

transactions_per_rollback_segment   integer    5                            

SQL> create table t(id number);

Table created.

SQL> select segment_name from user_segments where segment_name='T';

no rows selected                ------------- >没有创建segment

SQL> insert into t values(1);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> select segment_name from user_segments where segment_name='T';

SEGMENT_NAME                                                                  

--------------------------------------------------------------------------------

T                            ------------- >创建了segment                                        

SQL> alter system set deferred_segment_creation = false ;

System altered.

SQL> show parameter deferred_segment_creation

NAME                                TYPE       VALUE                        

------------------------------------ ----------- ------------------------------

deferred_segment_creation           boolean    FALSE    --------- >修改参数

SQL> drop table t purge;

Table dropped.

SQL> create table t (id number);

Table created.

SQL> select segment_name from user_segments where segment_name='T';

SEGMENT_NAME                                                                  

--------------------------------------------------------------------------------

T                                  ------------- >创建了segment                                          

SQL> create table t1(id number)segment creation deferred;  ------ >创建表时加option

Table created.

SQL> select segment_name from user_segments where segment_name='T1';

no rows selected                      ------------- >没有创建segment

SQL> alter system set deferred_segment_creation=true;

System altered.

SQL>

SQL>

SQL> create table t2(id number)segment creation immediate;    ------ >创建表时加option

Table created.

SQL> show parameter segment

NAME                                TYPE       VALUE                        

------------------------------------ ----------- ------------------------------

deferred_segment_creation           boolean    TRUE                         

rollback_segments                   string                                   

transactions_per_rollback_segment   integer    5                            

SQL>

SQL>

SQL> select segment_name from user_segments where segment_name='T2';

SEGMENT_NAME                                                                  

--------------------------------------------------------------------------------

T2              ------------- >创建了segment

总结:在创建表时,可以加option,如segment creation immediate/deferred,这时将用该属性取代系统参数deferred_segment_creation,如果建表时未加option,则参数起作用。

这里,还有一些限制条件,符合这些条件时,这些参数和表的属性就不再起作用了:

1)        分区表,会自己创建段;

2)        Sys用户创建时会自动创建段;

如下测试:

测试一:分区表

SQL> show parameter segment

NAME                                TYPE       VALUE                        

------------------------------------ ----------- ------------------------------

deferred_segment_creation           boolean    TRUE                         

rollback_segments                   string                                   

transactions_per_rollback_segment   integer    5                            

SQL>

SQL> create table tab_2(id number,time date)

2  partition by range(time)

3  interval (numtodsinterval(1,'hour'))

4 (

5 partition p2 values less than (to_date('2011-1-1 19:00:00','yyyy-mm-dd hh24:mi:ss'))

6 )

7 ;

Table created.

SQL> select segment_name,partition_name from user_segments where segment_name='TAB_2';

SEGMENT_NAME      PARTITION_NAME

------------------------------  -------------------------------

TAB_2              P2                                                          

测试二:sys用户

SQL> show parameter segment

NAME                                TYPE       VALUE                        

------------------------------------ ----------- ------------------------------

deferred_segment_creation           boolean    TRUE                         

rollback_segments                   string                                   

transactions_per_rollback_segment   integer    5                            

SQL> create table tab_3(id number);

Table created.

SQL> select segment_name from user_segments where segment_name='TAB_3';

SEGMENT_NAME                                                                  

--------------------------------------------------------------------------------

TAB_3                                                                         

SQL> create table tab_4(id number)segment creation deferred; ->加了该选项会报错

create table tab_4(id number) segment creation deferred

*

ERROR at line 1:

ORA-14223: Deferred segment creation is not supported for this table

SQL> show user

USER is "SYS"

l

      Temporary表空间特性支持创建临时表时可以指定临时表空间,11g之前,临时表空间是不能用shrink的,由于临时表空间由于sort的需要经常会扩展的很大,但之后并不会自己回收,通常的做法都是新创建一个临时表空间,然后切换表空间,这样做有一个缺点,就是有活动的事务在临时表空间时,是不能被切换的,只能等待。不过,虽然11g现在推出了这个新功能,建议还是少用为好,毕竟生产系统上,要么来这么一下,估计能难受得了,不过创建全局临时表能够指定临时表空间这个特性还是不错的。

测试:

  SQL>

SQL> create global temporary table temp_01(id number) on commit delete rowstablespace tbs_temp;

Table created.

SQL> select tablespace_name,contents from dba_tablespaces where contents='TEMPORARY';

TABLESPACE_NAME               CONTENTS                                       

------------------------------ ---------                                      

TEMP                          TEMPORARY                                      

TBS_TEMP                      TEMPORARY                                      

SQL> descdba_temp_free_space          ------ >新增加的视图

Name                                     Null?   Type

----------------------------------------- -------- ----------------------------

TABLESPACE_NAME                          NOT NULL VARCHAR2(30)

TABLESPACE_SIZE                                   NUMBER

ALLOCATED_SPACE                                   NUMBER

FREE_SPACE                                        NUMBER

SQL> select tablespace_size,allocated_space,free_space from dba_temp_free_space where tablespace_name='TBS_TEMP';

TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE                                    

--------------- --------------- ----------                                    

      10485760        1048576   9437184                                    

SQL> alter tablespace tbs_temp shrink space keep 5m;

Tablespace altered.

SQL> select tablespace_size,allocated_space,free_space from dba_temp_free_space where tablespace_name='TBS_TEMP';

TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE                                    

--------------- --------------- ----------                                    

       6291456        1048576   5242880                                    

SQL> alter tablespace tbs_temp shrink tempfile '+DG01/tbs_temp01.dbf';

alter tablespace tbs_temp shrink tempfile '+DG01/tbs_temp01.dbf'

*

ERROR at line 1:

ORA-03214: File Size specified is smaller than minimum required

SQL> alter tablespace tbs_temp shrink tempfile '+DG01/tbs_temp01.dbf' keep 4m;

Tablespace altered.

SQL> select tablespace_size,allocated_space,free_space from dba_temp_free_space where tablespace_name='TBS_TEMP';

TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE                                    

--------------- --------------- ----------                                    

       5234688        1040384   4194304

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值