EXP导出参数compress=y(n)的区别

如果在EXP的时候加了compress=y,这里的compress并非压缩dmp文件的意思

而是指在EXP的时候,  表的initial尺寸定义将会等于:

1、该表的当前实际占用空间尺寸。

2、或者该表曾经的最大占用空间尺寸,且高水位标记没有降下来。

  这表示即使该表没有一条记录, 但如果该表曾经有4M数据量, 且高水位

  标记没降下来,那么EXP的时候,加compress=y, 该表的initial将是4M

 

表的initial等于4M,那么在IMP的时候,不管该表有没有记录, 该表都将

占用4M空间。实验如下:

SQL> create table test nologging as select rownum id from dba_tab_columns;

Table created.

SQL> insert into test select * from test;

67448 rows created.

SQL> /

134896 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from test;

 COUNT(*)

----------

   269792

 

SQL> select segment_name,bytes from user_segments;

SEGMENT_NAME  BYTES

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

TEST          4194304

可以看到该表占用了4M空间

 

现在用delete方式(不降低HWM), 删除test表的所有记录

SQL> delete test;

269792 rows deleted.

SQL> commit;

Commit complete.

SQL> select count(*) from test;

 COUNT(*)

----------

        0

然后分别用compress=y和n引导出

exp test/test file=test_y.dmp tables=test compress=y

exp test/test file=test_n.dmp tables=test compress=n

 

此时有两个文件,其中

test_n.dmp表示没加 compress=Y 参数

test_y.dmp表示加了 compress=Y 参数

2009-09-26  13:01             4,096 test_n.dmp

2009-09-26  13:01             4,096 test_y.dmp

 

然后我们删除该表

SQL> truncate table test;

Table truncated.

SQL> drop table test;

Table dropped.

purge recyclebin;

 

再看此时该表所在表空间的占用情况

select /*+ ordered use_merge(a,b) */

      a.tablespace_name               表空间名,

      total/(1024*1024)               表空间大小,

      (total-free)/(1024*1024)        表空间使用大小,

      free/(1024*1024)                表空间剩余大小,

      round((total-free)/total,4)*100 "使用率%"

from   (select  tablespace_name,sum(bytes) free from dba_free_space

       group   by tablespace_name) a,

      (select  tablespace_name,sum(bytes) total from dba_data_files

       group   by tablespace_name) b

where  a.tablespace_name = b.tablespace_name

and    a.tablespace_name = 'TS_TEST';

 

表空间名   表空间使用大小

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

TS_TEST    1016.625

 

然后导入test_y.dmp, 看表空间的增长情况

imp test/test file=test_y.dmp fromuser=test touser=test

 

select /*+ ordered use_merge(a,b) */

      a.tablespace_name               表空间名,

      total/(1024*1024)               表空间大小,

      (total-free)/(1024*1024)        表空间使用大小,

      free/(1024*1024)                表空间剩余大小,

      round((total-free)/total,4)*100 "使用率%"

from   (select  tablespace_name,sum(bytes) free from dba_free_space

       group   by tablespace_name) a,

      (select  tablespace_name,sum(bytes) total from dba_data_files

       group   by tablespace_name) b

where  a.tablespace_name = b.tablespace_name

and    a.tablespace_name = 'TS_TEST';

 

表空间名   表空间使用大小

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

TS_TEST    1020.625

发现,TS_TEST表空间多了4M占用,而此时表test并无记录

然后用PL/SQL DEVELOPER的导出工具来看此时test表的定义

发现,test表的initial 值是4M

create table TEST.TEST

(

 ID NUMBER

)

tablespace TS_TEST

 pctfree 10

 initrans 1

 maxtrans 255

 storage

 (

   initial 4M

   minextents 1

   maxextents unlimited

 );

 

接着,再换一个文件test_n.dmp导入

SQL> truncate table test;

Table truncated.

SQL> drop table test;

Table dropped.

purge recyclebin;

imp test/test file=test_n.dmp fromuser=test touser=test

 

然后看表空间使用情况

select /*+ ordered use_merge(a,b) */

      a.tablespace_name               表空间名,

      total/(1024*1024)               表空间大小,

      (total-free)/(1024*1024)        表空间使用大小,

      free/(1024*1024)                表空间剩余大小,

      round((total-free)/total,4)*100 "使用率%"

from   (select  tablespace_name,sum(bytes) free from dba_free_space

       group   by tablespace_name) a,

      (select  tablespace_name,sum(bytes) total from dba_data_files

       group   by tablespace_name) b

where  a.tablespace_name = b.tablespace_name

and    a.tablespace_name = 'TS_TEST';

表空间名   表空间使用大小

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

TS_TEST    1016.625

发现表空间的已用空间几乎没有增加

然后用PL/SQL DEVELOPER的导出工具来看此时test表的定义

发现test表的initial 是 64K

create table TEST.TEST

(

 ID NUMBER

)

tablespace TS_TEST

 pctfree 10

 initrans 1

 maxtrans 255

 storage

 (

   initial 64K

   minextents 1

   maxextents unlimited

 );

 

另外,如果表的initial 已经是 4M,那么即使是compress=N 也会生成 INITIAL 4M 的定义

可以通过命令修改initial值

alter table test move storage(initial 64K);

 

compress=Y主要目的是为了消除存储碎片,以保证某张表的所有记录都存储在连续的空间里

但是负面效应很明显,且自oracle9i开始,使用了本地管理的表空间,存储碎片的问题应该

比低版本好多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值