insert的時候使用append會不會影響到表的大小

charsi發表於2010-11-09

我們在insert表的時候,經常會使用append的方式來提高效率.
append的會將insert的資料直接加到表的最後,而不會在表的空閒塊中插入資料.無論是歸檔模式還是非歸檔模式,append會減少產生的日誌,產生的UNDO也比較少。append屬於direct insert,因此會提高insert的效率.

那麼insert使用append與不使用append,表的大小會不會不同呢?
我簡單做了個試驗:

(1)在沒有做insert之前的表的
select * from dba_segments where tablespace_name='TS_CHARIS';
HEADER_BLOCK BYTES BLOCKS
45835 1342177280 163840

原表資料佔用163840個塊

(2)執行insert(不使用append)
SQL> insert into TEST_PARALLEL (select * from tmp_mid_data);

5000000 rows created.

Elapsed: 00:01:35.97
SQL>
SQL> rollback;

Rollback complete.

Elapsed: 00:04:03.95
SQL>

select * from dba_segments where tablespace_name='TS_CHARIS';
HEADER_BLOCK BYTES BLOCKS
45835 1879048192 229376

可以看到沒有使用append的方式的BLOCKS為229376

(3)恢復資料到原來的資料
SQL> alter table TEST_PARALLEL move;

Table altered.

Elapsed: 00:04:12.97

select * from dba_segments where tablespace_name='TS_CHARIS';

HEADER_BLOCK BYTES BLOCKS
45891 1342177280 163840

恢復原表佔用163840個BLOCKS

(4)執行insert(使用append)
SQL> insert /*+ append */ into TEST_PARALLEL (select * from tmp_mid_data);

5000000 rows created.

Elapsed: 00:01:19.12
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.05
SQL>


select * from dba_segments where tablespace_name='TS_CHARIS';

HEADER_BLOCK BYTES BLOCKS
45891 1879048192 229376

加append的與不加append的方式,表的佔用空間相同.另外通過兩次rollback的時間比較,前者花費了4分,後者花費了不到1秒,說明不使用append進行insert的話,會佔用undo空間,rollback會進行計算;而使用append則不會佔用太大的空間.

(5)繼續進行試驗(模擬存在碎片的情況)
SQL> alter table TEST_PARALLEL move;

Table altered.

Elapsed: 00:03:30.89
SQL> insert into TEST_PARALLEL (select * from tmp_mid_data);

5000000 rows created.

Elapsed: 00:01:25.86
SQL> rollback;

Rollback complete.

Elapsed: 00:04:09.86

此時的表佔用的空間情況:
select * from dba_segments where tablespace_name='TS_CHARIS';
HEADER_BLOCK BYTES BLOCKS
45891 1879048192 229376

SQL> insert into TEST_PARALLEL (select * from tmp_mid_data where rownum <1000001);

1000000 rows created.

Elapsed: 00:01:04.92

此時的表佔用的空間情況:
HEADER_BLOCK BYTES BLOCKS
45891 1879048192 229376

可以看到,由於表存在碎片,所以這次insert的之後,表的空間沒有再變化(高水位沒有變化).新插入的資料都儲存在空閒的空間之中.
SQL> rollback;

Rollback complete.

Elapsed: 00:00:02.76
SQL>
SQL>
SQL>
SQL> insert /*+ append */ into TEST_PARALLEL (select * from tmp_mid_data where rownum <1000001);

1000000 rows created.

Elapsed: 00:00:30.11
SQL>
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.03

再看看錶佔用的空間,如果使用append的話,insert會直接從表的高水位開始追加資料.
HEADER_BLOCK BYTES BLOCKS
45891 2013265920 245760


通過實驗可以說明:
1.使用append可以提高insert的效率;
2.使用append很少使用UNDO空間;
3.使用append不會使用表中存在的碎片空間,會直接從表的高水位開始追加資料.

[@more@]

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

相關文章