我们在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不会使用表中存在的碎片空间,会直接从表的高水位开始追加数据.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23850820/viewspace-1041319/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23850820/viewspace-1041319/