Oracle exp 中 compress 参数的影响测试
1 创建表时 initial 默认为 64K ,手动设置为 5M ;
SQL> create table t1(id number) storage(initial 5m);
2 没有 T1 的相关数据
SQL> select segment_name,bytes,initial_extent from user_segments;
原因: 在没有插入数据时,不会分配空间,在用户段中也查询不到,这是 11g 的新功能,延时段分配;
3 插入数据
SQL> insert into t1 values(1);
SQL> COMMIT;
4 t1 表所占空间为 5M ,初始值 5M
SQL> select segment_name,bytes,initial_extent from user_segments;
T1(bytes=5242880,initial_extent=5242880)
5 清空表
SQL> truncate table t1;
6 t1 表所占空间变成 initial 初始值 5M
SQL> select segment_name,bytes,initial_extent from user_segments;
T1(bytes=5242880,initial_extent=5242880)
SQL> select 5242880/1024/1024 from dual; ---5M
清空表后,t1 仍然占有5M 的空间,即初始区分配的大小
7 更改 initial 参数
SQL> alter table t1 move storage(initial 64K);
SQL> select segment_name,bytes,initial_extent from user_segments;
T1( bytes=65536 ,initial_extent=65536)
8 插入数据
SQL> insert into t1 select level as id from dual connect by level<=100;
9 t1 表所占空间为 64K
SQL> select segment_name,bytes,initial_extent from user_segments;
T1(bytes=65536,initial_extent=65536)
因为插入的数据很小,不足64K ,所以区的个数没有增加
10 清空表 t1
SQL> truncate table t1;
SQL> select segment_name,bytes,initial_extent from user_segments;
T1(bytes=65536,initial_extent=65536)
11 插入大量数据
SQL> insert into t1 select level as id from dual connect by level<=1000000;
12 查询 , 表 t1 所占空间 13M ,区扩展 28 个
SQL> select segment_name,bytes,initial_extent from user_segments;
T1(bytes=13631488,initial_extent=65536,extents=28)
select 13631488/1024/1024 from dual;---13M
13 exp 导出 t1( 不指定 compress 参数,则默认 Y)
[oracle11@back ~]$ exp chen/chen file=a.dmp tables=t1
......
About to export specified tables via Conventional Path ...
. . exporting table T1 1000000 rows exported
Export terminated successfully without warnings.
......
14 导入
SQL> show user
USER is "CHEN"
SQL> drop table t1 purge;
[oracle11@back ~]$ imp chen/chen file=a.dmp fromuser=chen touser=chen ignore=y
......
. importing CHEN's objects into CHEN
. . importing table "T1" 1000000 rows imported
Import terminated successfully without warnings.
......
SQL> col segment_name for a25
SQL> select segment_name,bytes,initial_extent,EXTENTS from user_segments;
SEGMENT_NAME BYTES INITIAL_EXTENTS EXTENTS
------------------------- ---------- -------------- -------
T1 13631488 13631488 1
.....
10 rows selected.
导入后表 t1 的 初始值 自动变成所有区的 总和 , 区由 28 个变成1 个 ,也就是将 28 个区压缩成一个区 ,这是由于 compress=Y 参数引起的。
compress=Y 主要目的是 为了消除存储碎片 ,以保证某张表的所有记录都存储在连续的空间里。
但是负面效应很明显,且自 oracle9i 开始,使用了本地管理的表空间,存储碎片的问题应该比低版本好多了。
15 更改 t1 初始值为 64K
SQL> alter table t1 move storage(initial 64k);
SQL> select segment_name,bytes,initial_extent from user_segments;
SEGMENT_NAME BYTES INITIAL_EXTENT
------------------------- ---------- --------------
T1 13631488 65536
......
10 rows selected.
16 重新导出导入 , 指定 compress=n
[oracle11@back ~]$ rm -rf a.dmp
[oracle11@back ~]$ exp chen/chen file=a.dmp tables=t1 compress=n
......
About to export specified tables via Conventional Path ...
. . exporting table T1 1000000 rows exported
Export terminated successfully without warnings.
......
SQL> drop table t1 purge;
[oracle11@back ~]$ imp chen/chen file=a.dmp fromuser=chen touser=chen ignore=y
......
. importing CHEN's objects into CHEN
. . importing table "T1" 1000000 rows imported
Import terminated successfully without warnings.
......
17 导出时取消压缩 (compress=N), 初始值和区的个数不变
SQL> select segment_name,bytes,initial_extent from user_segments;
SEGMENT_NAME BYTES INITIAL_EXTENT EXTENTS
------------------------- ---------- -------------- -------
T1 13631488 65536 28
......
10 rows selected.
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29785807/viewspace-1775132/ ,如需转载,请注明出处,否则将追究法律责任。