EXP匯出引數compress=y(n)的區別

不一樣的天空w發表於2017-04-07

以下轉自:http://www.itpub.net/thread-1220596-1-1.html 作者:atgc


如果在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開始,使用了本地管理的表空間,儲存碎片的問題應該

比低版本好多了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2136790/,如需轉載,請註明出處,否則將追究法律責任。

相關文章