EXP的compress=Y参数

[复制链接]
查看11 | 回复9 | 2007-1-6 21:14:12 | 显示全部楼层 |阅读模式
如果在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_NAMEBYTES
-----------------
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-2613:01
4,096 test_n.dmp
2009-09-2613: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 (selecttablespace_name,sum(bytes) free from dba_free_space
group by tablespace_name) a,
(selecttablespace_name,sum(bytes) total from dba_data_files
group by tablespace_name) b
wherea.tablespace_name = b.tablespace_name
anda.tablespace_name = 'TS_TEST';
表空间名 表空间使用大小
-------- ----------
TS_TEST1016.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 (selecttablespace_name,sum(bytes) free from dba_free_space
group by tablespace_name) a,
(selecttablespace_name,sum(bytes) total from dba_data_files
group by tablespace_name) b
wherea.tablespace_name = b.tablespace_name
anda.tablespace_name = 'TS_TEST';
表空间名 表空间使用大小
-------- ----------
TS_TEST1020.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 (selecttablespace_name,sum(bytes) free from dba_free_space
group by tablespace_name) a,
(selecttablespace_name,sum(bytes) total from dba_data_files
group by tablespace_name) b
wherea.tablespace_name = b.tablespace_name
anda.tablespace_name = 'TS_TEST';
表空间名 表空间使用大小
-------- ----------
TS_TEST1016.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开始,使用了本地管理的表空间,存储碎片的问题应该
比低版本好多了。
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
学习了 谢谢
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
nice
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
http://www.itpub.net/thread-1220596-1-1.html
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
好,以前也是按照字面的意思,还以为是对DMP文件进行压缩呢。结果导致所有表的initial size都等于当前表的大小了。
其实觉得oracle不太地道,基本上随便整个压缩,都可以让DMP文件大小减少到10%左右,应该增加个真正的压缩选项,省很多麻烦。
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
挺讨厌这个参数的,而且还是默认值。
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
好贴
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
HuiYiSky 发表于 2010-1-12 16:22
挺讨厌这个参数的,而且还是默认值。

你是说采用COMPRESS=n比较好?
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
如果是EXPDP, COMPRESS=Y确实压缩了DMP文件,而且效果比ZIP好。
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
这个tom的书里也有说
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行