查看: 29470|回复: 12

EXP的compress=Y参数

[复制链接]
论坛徽章:
115
生肖徽章:狗
日期:2007-01-06 21:14:12马上有车
日期:2014-03-06 16:45:08马上加薪
日期:2014-05-09 12:27:582014年世界杯参赛球队: 英格兰
日期:2014-07-03 13:10:44青年奥林匹克运动会-竞技体操
日期:2014-09-10 15:30:57马上有钱
日期:2014-10-31 13:56:48美羊羊
日期:2015-03-04 14:48:582015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-04-23 19:26:10金牛座
日期:2015-09-17 08:21:44
跳转到指定楼层
1#
发表于 2009-9-26 13:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果在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
2#
发表于 2009-9-26 14:24 | 只看该作者
学习了 谢谢

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
3#
发表于 2009-9-26 16:43 | 只看该作者
nice

使用道具 举报

回复
论坛徽章:
0
4#
发表于 2010-1-12 13:03 | 只看该作者

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
5#
发表于 2010-1-12 14:14 | 只看该作者
好,以前也是按照字面的意思,还以为是对DMP文件进行压缩呢。结果导致所有表的initial size都等于当前表的大小了。

其实觉得oracle不太地道,基本上随便整个压缩,都可以让DMP文件大小减少到10%左右,应该增加个真正的压缩选项,省很多麻烦。

使用道具 举报

回复
论坛徽章:
22
授权会员
日期:2007-03-30 06:18:532010年世界杯参赛球队:斯洛文尼亚
日期:2010-01-11 10:40:422010广州亚运会纪念徽章:保龄球
日期:2011-01-12 13:22:412011新春纪念徽章
日期:2011-02-18 11:42:50茶鸡蛋
日期:2011-07-19 01:02:42ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26双黄蛋
日期:2011-12-20 13:19:21蜘蛛蛋
日期:2013-01-06 13:18:37蜘蛛蛋
日期:2013-01-07 14:31:182013年新春福章
日期:2013-02-25 14:51:24
6#
发表于 2010-1-12 16:22 | 只看该作者
挺讨厌这个参数的,而且还是默认值。

使用道具 举报

回复
论坛徽章:
0
7#
发表于 2010-4-27 14:50 | 只看该作者

学习了

好贴

使用道具 举报

回复
论坛徽章:
26
2009新春纪念徽章
日期:2009-01-04 14:52:28咸鸭蛋
日期:2011-11-13 14:16:262012新春纪念徽章
日期:2012-01-04 11:51:22紫蛋头
日期:2012-02-02 13:13:42玉石琵琶
日期:2012-02-21 15:04:38蛋疼蛋
日期:2012-03-09 08:25:45奥运纪念徽章
日期:2012-11-27 15:37:34复活蛋
日期:2012-12-07 13:05:172013年新春福章
日期:2013-02-25 14:51:242014年世界杯参赛球队:西班牙
日期:2014-06-26 12:03:53
8#
发表于 2011-11-29 04:07 | 只看该作者
HuiYiSky 发表于 2010-1-12 16:22
挺讨厌这个参数的,而且还是默认值。

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

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
9#
发表于 2011-11-29 05:55 | 只看该作者
如果是EXPDP, COMPRESS=Y确实压缩了DMP文件,而且效果比ZIP好。

使用道具 举报

回复
论坛徽章:
26
2010年世界杯参赛球队:智利
日期:2010-07-03 17:16:26比亚迪
日期:2014-01-16 17:12:41宝马
日期:2014-01-24 10:32:252014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上有对象
日期:2014-03-05 21:30:32马上有车
日期:2014-03-11 16:46:45优秀写手
日期:2014-03-25 05:59:50马上加薪
日期:2014-03-26 16:46:30问答徽章
日期:2014-05-09 16:40:36
10#
发表于 2011-11-29 14:32 | 只看该作者
这个tom的书里也有说

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表