经过前几篇特性的简述,这里就直入主题了。呵呵
l
首先,从磁盘说起,这个可以说是存储的底层啊,在R2中,支持4k大小的sector disk,针对高性能、高吞吐量的要求,现在磁盘的性能要求也在提高。目前,通常情况下都是512byte大小的sector。这里说起了sector size,那么这跟oracle有什么关系呢?接下来,将简述下它们之间的关系。
当oracle使用asm管理的diskgroup之后,势必会将datafile/controlfile/online log。。。存入diskgroup,在这时就产生了针对不同类型的文件,会对应不同的blocksize,如controlfile的blocksize是16k,log文件是512byte(磁盘的sector size是512byte,而当使用文件系统来存放log文件的话,会根据文件系统的blocksize来决定log文件的blocksize大小是多少,像window、linux一般都是使用4k大小的数据页),datafile的blocksize就根据数据库的blocksize来决定了(或者说是创建表空间是指定的blocksize),由于log文件具有这种特殊性,所以一旦将oracle从具有512 byte sector size大小的disk迁移到具有4k sector size大小的disk时,需要着重考虑,在迁移库时应该重新创建几组log,在mount阶段切换几组log,从而可以在open之前,替换掉之前的log,因为在4k sector的disk上是不能兼容具有512byte大小的log文件。Controlfile就不一样了,由于是16k块大小的,所以4k对它来说还是没问题的。
l
其次,谈下关于表的压缩。在11gR2中支持传统的DML(insert/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 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