ü COMPRESS压缩参数
Compress参数含义很清楚:就是在存储数据表数据的时候是否启用压缩选项。压缩使用的级别是数据块block级别。Oracle对数据块的压缩采用相邻相同值合并的压缩算法。
Compress参数有两个系列参数:
1、OMPRESS FOR DIRECT_LOAD OPERATIONS:作用于Compress相同,适合于数据仓库OLAP系统。只在直接插入过程中在表或者分区上启用压缩技术;
2、COMPRESS FOR ALL OPERATIONS:适合于OLTP系统,针对所有的操作均启用了压缩选项。要求的版本较高。
下面,我们通过一个小实验,来确定压缩效果。首先,构建两个数据表test和test1,数据量和顺序相同,只是参数不同。
SQL> conn scott/tiger@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
SQL> set timing on;
SQL> create table test nocompress as select * from all_objects where 1=0;
Table created
Executed in 0.11 seconds
SQL> insert /*+append */ into test select * from all_objects;
40724 rows inserted
(提交和重复执行该语句,篇幅原因省略…)
SQL> insert into test select * from test;
122170 rows inserted
Executed in 8.412 seconds
SQL> select count(*) from test;
COUNT(*)
----------
244340
Executed in 0.872 seconds
SQL> exec dbms_stats.gather_table_stats('SCOTT','TEST',cascade => true);
PL/SQL procedure successfully completed
Executed in 2.354 seconds
//压缩数据表
SQL> create table test1 compress as select * from all_objects where 1=0;
Table created
Executed in 0.17 seconds
SQL> insert /*+append */ into test1 select * from all_objects;
40724 rows inserted
Executed in 2.724 seconds
(提交和重复执行该语句,篇幅原因省略…)
SQL> insert into test1 select * from test1;
122172 rows inserted
Executed in 1.562 seconds
SQL> commit;
Commit complete
Executed in 0.03 seconds
SQL> select count(*) from test1;
COUNT(*)
----------
244344
Executed in 0.03 seconds
SQL> exec dbms_stats.gather_table_stats('SCOTT','TEST1',cascade => true);
PL/SQL procedure successfully completed
Executed in 0.501 seconds
两个数据表数据量和结构完全相同,内容也相同。经过分析后,我们检查数据字典反应的情况。
SQL> select segment_name, segment_type, bytes/1024/1024 MB, blocks, extents from user_segments where segment_name in ('TEST','TEST1');
SEGMENT_NA SEGMENT_TY MB BLOCKS EXTENTS
---------- ---------- ---------- ---------- ----------
TEST1 TABLE 17 2176 32
TEST TABLE 28 3584 43
Executed in 0.08 seconds
结果很清楚了,在没有使用压缩技术的TEST数据表,占有空间28MB,共3584个数据块。而采用过数据库压缩技术后,空间使用到了17MB,共2176个数据块,空间节省39%左右。
进一步实验,根据Oracle压缩的方法,我们尝试将近似的行之间相同数据情况增加。all_objects视图中,owner和object_type相似度较高,选择性低,这样我们组织数据形态。
//构建实验数据表三
SQL> create table test2 compress as select * from test1 order by owner,object_type;
Table created
Executed in 5.719 seconds
SQL> exec dbms_stats.gather_table_stats(user,'TEST2',cascade => true);
PL/SQL procedure successfully completed
Executed in 1.102 seconds
SQL> select segment_name, segment_type, bytes/1024/1024 MB, blocks, extents from user_segments where segment_name in ('TEST','TEST1','TEST2');
SEGMENT_NA SEGMENT_TY MB BLOCKS EXTENTS
---------- ---------- ---------- ---------- ----------
TEST1 TABLE 17 2176 32
TEST TABLE 28 3584 43
TEST2 TABLE 10 1280 25
Executed in 0.08 seconds
按照算法特征进行整理之后,数据表大小便为了10M,压缩率提高到了64%。
ü LOGGING:日志记录
LOGGING参数表示对数据表或者其他对象进行变化性操作的时候,是否计入到REDO日志中。默认情况下,Oracle对数据库对象的任何修改性操作都会计入到redo log中,作为数据库恢复使用。开启logging功能,是保证数据库数据一致性的重要一步。
有一些时候,我们可能会不希望记日志操作。因为logging的时候会存在相当的性能损失,为了避免这种损失,加快操作速度,我们可能会选择暂时性的设置数据表为nologging状态。比如,我们在进行大规模数据加载的时候,可能就会选择这种方式。
先不论nologging的好坏,有几个问题笔者需要说明。首先,启用数据表的nologging绝不意味着说一点重做日志都不书写。在运行过程中,数据表对应的索引对象等内容,都有一个重建的过程,这个过程是需要写入redo log的。第二,不启用redo log,的确会带来一定的性能提升。但是没有日志的数据库是极其危险的,一旦发生实例崩溃或者数据库崩溃这种情况,数据库数据丢失和不一致的情况是可能发生的。这种方法得不偿失。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-688047/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-688047/