ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据表创建参数介绍(二)

数据表创建参数介绍(二)

原创 Linux操作系统 作者:realkid4 时间:2011-02-27 20:00:27 2 删除 编辑

 

ü        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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7747065