insert的时候使用append会不会影响到表的大小

我们在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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23850820/viewspace-1041319/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值