ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle11gR2新特性之四--存储方面的改进

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

原创 Linux操作系统 作者:jack22220613 时间:2011-03-10 17:46:26 0 删除 编辑

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

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 operations compress 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 rows tablespace tbs_temp;

 

Table created.

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

 

TABLESPACE_NAME                CONTENTS                                        

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

TEMP                           TEMPORARY                                       

TBS_TEMP                       TEMPORARY                                       

 

SQL> desc dba_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 

5.jpg

6.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10037372/viewspace-689019/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-05-13

  • 博文量
    94
  • 访问量
    357888