alter table move 和 alter table shrink movespace的区别

oracle&&alter&table&..move&和alter&table..&shrink&space速度和存储需求比较
实验在vmware虚拟机64位的solaris操作系统,10g release 2环境实现
本例中使用到用户tj,tj用户使用表空间usertest,并有无限的配额。
bash-3.00$ isainfo
64-bit amd64 kernel
bash-3.00$ uname
SunOS sunos 5.10
Generic_ i86pc i386 i86pc
bash-3.00$ sqlplus / as
SQL*Plus: Release 10.2.0.1.0
- Production on Sun Jan 8 19:32:01 2012
Copyright (c) ,
Oracle.& All
rights reserved.
Connected to:
Oracle Database 10g
Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP
and Data Mining options
Connected.
首先查看数据库存储使用情况,这里使用到了脚本tspace.sql ,脚本内容不做介绍
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.8125&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
&&&&&&&40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
.1875&&&&&&&&&
100&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
399.9375&&&&&&&
100&&&&&&&&&
7 rows selected.
00:00:00.03
1.首先测试alter table .. move
conn tj/tj
Connected.
00:00:00.08
本例大表的创建借助了tom的脚本。
tj@DB01& get
big_table.sql
& 1& create table
& 3& select rownum id,
from all_objects a
& 7& alter table big_table
& 8& declare
l_rows number := &1;
&11& begin
into big_table
select rownum, a.*
&15&&&&&&&
from all_objects a
where rownum &= &1;
l_cnt := sql%
while (l_cnt & l_rows)
&21&&&&&&&&&
insert into big_table
&22&&&&&&&&&
select rownum+l_cnt,
&23&&&&&&&&&&&&&&&&
OWNER, OBJECT_NAME, SUBOBJECT_NAME,
&24&&&&&&&&&&&&&&&&
OBJECT_ID, DATA_OBJECT_ID,
&25&&&&&&&&&&&&&&&&
OBJECT_TYPE, CREATED, LAST_DDL_TIME,
&26&&&&&&&&&&&&&&&&
TIMESTAMP, STATUS, TEMPORARY,
&27&&&&&&&&&&&&&&&&
GENERATED, SECONDARY
&28&&&&&&&&&&&
from big_table
&29&&&&&&&&&&
where rownum &= l_rows-l_
&30&&&&&&&&&
l_cnt := l_cnt + sql%
&31&&&&&&&&&
&35& alter table big_table
add constraint
&36& big_table_pk primary
&38& begin
dbms_stats.gather_table_stats
( ownname&&&
tabname&&&
=& 'BIG_TABLE',
method_opt =& 'for all indexed columns',
&&&&cascade&&&
=& TRUE );
&46* select count(*)
创建一个拥有2000000数据的大表
@big_table
Table created.
00:00:00.55
00:00:00.05
Enter value for 1:
l_rows number := &1;
l_rows number := 2000000;
Enter value for 1:
9:&&&&&&&&
where rownum &= &1;
9:&&&&&&&&
where rownum &= 2000000;
PL/SQL procedure
successfully completed.
00:00:07.59
Table altered.
00:00:19.69
PL/SQL procedure
successfully completed.
00:00:03.07
& COUNT(*)
----------
00:00:00.08
打开另外一个窗口,观察表空间使用的情况,计算big_table的大小
$ sqlplus / as
SQL*Plus: Release 10.2.0.1.0
- Production on Sun Jan 8 19:02:32 2012
Copyright (c) ,
Oracle.& All
rights reserved.
Connected to:
Oracle Database 10g
Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP
and Data Mining options
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.3125&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
&&&&&&&&2&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
193.9375&&&&&&&&
26&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST &&&&&&&&&&&400&&
132.9375&&&&&&&&
33&&&&&&&&
select 400-133
----------
表的大小是267M。
回到第一个窗口,删除表中不同位置的一些数据,模拟表碎片的状况
delete from big_table where id&=100000 and
id&=400000;
300001 rows
00:00:17.04
Commit complete.
00:00:00.02
delete from big_table where id&=800000 and
id&=1200000;
400001 rows
00:01:03.56
delete from big_table where id&=1700000;
300001 rows
00:00:29.02
Commit complete.
00:00:00.04
观察第二个窗口,看数据删除以后,表空间的存储使用情况。发现并没有什么变化,delete语句不会释放存储。
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
&&&60&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
1.4375&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375 &&&&&&&&33&&&&&&&&
7 rows selected.
执行alter table
..move命令,计算命令需要时间。
alter table big_
00:00:18.85
在执行过程中,在第二个窗口观察,表空间使用情况
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
&2&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
1.3125&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&
&&&&400&&&
60.9375 &&&&&&&&15&&&&&&&&
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
&&&&&&100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
1.3125&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
12.9375&&&
&&&&&&3&&&&&&&&
7 rows selected.
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5 &&&&&&&&&2&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
1.3125&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
12.9375&&&&
&&&&&3&&&&&&&&
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&
&&&&&&&&750&&&&
1.3125&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
244.9375 &&&&&&&&61&&&&&&&&
7 rows selected.
select 400-244.9375
400-244.9375
------------
通过以上一段查询结果我们发现,在执行move命令过程当中,表空间的空闲空间会越来越少,在本例中当剩余空间到12.9375时,move操作最终完成,并最终释放空间,表在执行move操作后,表的大小由267M缩小到155M(也就是说有267-155=112M的碎片空间)。
move操作的完成需要额外的表空间存储来实现,但这个大小并不是表的大小的1倍,而是根据表上的碎片空间来决定,碎片空间越大,需要的表空间上额外的空间就会越少。当然对于特别大的表,建议表做分区,对每个分区单独move这样时间和空间需求都可以进一步控制。
2.接下来测试alter table.. shrink space操作,要求表空间是ASSM管理。为了进行比较,所做的操作一致。
tj@DB01& drop
table big_
00:00:02.76
@big_table
00:00:00.20
00:00:00.03
Enter value for 1:
l_rows number := &1;
l_rows number := 2000000;
Enter value for 1:
9:&&&&&&&&
where rownum &= &1;
9:&&&&&&&&
where rownum &= 2000000;
PL/SQL procedure
successfully completed.
00:00:08.97
00:00:15.88
PL/SQL procedure
successfully completed.
00:00:03.46
& COUNT(*)
----------
00:00:00.07&
在另外一个窗口观察,表的大小还是267M。
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
&&&96&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
1.1875&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75 &&&&&&&&32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375&&&&&&&&
33&&&&&&&&
回到到第一个窗口,开始删除数据
tj@DB01&& delete from big_table
where id&=100000 and
id&=400000;
300001 rows
00:00:19.81
delete from big_table where id&=800000 and
id&=1200000;
400001 rows
00:00:28.84
00:00:00.03
delete from big_table where id&=1700000;
300001 rows
00:00:36.38
Commit complete.
00:00:00.01
在第二个窗口观察,表空间没有任何变化
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
4096 &&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
1.1875&&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375&&&&&&&&
33&&&&&&&&
回到第一个窗口,执行shrink
操作,为了执行这个命令,首先把表的row
movement属性开启。
select table_name,row_movement from user_
TABLE_NAME&&&&&&&&&&&&&&&&&&&&
------------------------------ --------
BIG_TABLE&&&&&&&&&&&&&&&&&&&&&
00:00:00.11
alter table big_table
Table altered.
00:00:00.07
alter table big_
00:03:40.39
在第一个窗口执行命令的过程中,在第二个窗口观察表空间存储的变化
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
&&&&&&&60&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
90.3125&&&&&&&&
12&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375 &&&&&&&&33&&&&&&&&
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&
&&&&&&&750&&&
82.3125&&&&&&&&
11&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375&&&&&&&&
33&&&&&&&&
7 rows selected.
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&
&&&&&5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
74.3125&&&&&&&&
10&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375 &&&&&&&&33&&&&&&&&
7 rows selected.
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
74.3125&&&&&&&&
10&&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
132.9375&&
&&&&&&33&&&&&&&&
7 rows selected.
&sys@DB01& /&&
Tablespace&&
Total Size&
Free Size&& Pct
Free&& Pct
Used&&&&&&
------------ ----------
---------- ---------- ---------- ----------
USERDATA&&&&&&&&&&
100&&&&&&&&&
SYSAUX&&&&&&&&&&&&&
10.25&&&&&&&&&
USERS&&&&&&&&&&&&&&&&
5&&&&&&&&&
40&&&&&&&&
SYSTEM&&&&&&&&&&&&&
266.5625&&&&&&&&
36&&&&&&&&
UNDOTBS1&&&&&&&&&&&
.3125&&&&&&&&&
100&&&&&&&
EXAMPLE&&&&&&&&&&&&
31.75&&&&&&&&
32&&&&&&&&
USERTEST&&&&&&&&&&&
254.5625& &&&&&&&64&&&&&&&&
7 rows selected.
在以上的结果中,我们发现在命令执行过程当中,表的存储空间并没有任何变化,当命令执行完成后,存储空间释放。
&综合以上分析,move操作需要使用额外的表空间存储,但是速度更快(本例中
00:00:18.85)
&&&&&&&&&&&&&
shrink space操作,不需要任何额外的空间,但是速度要慢上很多(本例中
00:03:40.39)
不建议在业务高峰时使用move和shrink space命令,move操作会锁住表,这样其他并发的用户在表上执行的DML语句会产生等待。shrink操作可以把他理解成内部的DML语句操作,所以不会对表生成排他锁(只在调整高水位线的时候会产生表的排他锁),其他用户的DML语句可以照常执行,建议如果非要在业务高峰期操作,为了不影响其他用户可以考虑使用
shrink space命令。
可以把shrink命令分解:
1.只压缩空间不调整水位线
在业务繁忙时可以执行。
&alter table
2.调整水位线&
会产生锁,可以在业务比较少的时候执行,oracle 会记住1步骤中的操作,只调整水位线。
table big_table shrink
move命令会影响到表上的索引,索引需要rebuild。
shrink命令,oracle会维护索引,不用我们考虑。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 47244
博文数量: 24
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
今天主要从两点说他们的区别:1. 碎片的整理2.空间的收缩SQL> select * from v$BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64biPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 ProductionTNS for Linux: Version 10.2.0.1.0 - ProductionNLSRTL Version 10.2.0.1.0 - ProductionSQL>创建测试表SQL> create table test3 as2 select rownum id,3 dbms_random.string('a', round(dbms_random.value(0,10))) col1,4 trunc(sysdate) - dbms_random.value(1, 365*2) col25 from dual connect by rownum<=10000;Table createdSQL> select count(1) from test3;COUNT(1)----------10000查看表test3的blocks使用情况:SQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................40Total Bytes.............................327680Unused Blocks...........................3Unused Bytes............................24576Last Used Ext FileId....................31Last Used Ext BlockId...................481921Last Used Block.........................5*************************************************0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............025% -- 50% free space bytes.............050% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................32Total bytes.............................262144PL/SQL procedure successfully completed制造碎片SQL> DELETE FROM TEST3 WHERE MOD(ID,3)=1;3334 rows deletedSQL>Commit complete发现有碎片了SQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................40Total Bytes.............................327680Unused Blocks...........................3Unused Bytes............................24576Last Used Ext FileId....................31Last Used Ext BlockId...................481921Last Used Block.........................5*************************************************0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............3125% -- 50% free space bytes.............25395250% -- 75% free space blocks............150% -- 75% free space bytes.............819275% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................0Total bytes.............................0PL/SQL procedure successfully completedSQL>消除碎片SQL> alter table test3Table altered查看碎片消除的效果SQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................32Total Bytes.............................262144Unused Blocks...........................6Unused Bytes............................49152Last Used Ext FileId....................31Last Used Ext BlockId...................485065Last Used Block.........................2*************************************************0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............025% -- 50% free space bytes.............050% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................22Total bytes.............................180224PL/SQL procedure successfully completedSQL>从以上看,碎片整理的效果很好!!!下面在测试用shrink整理碎片重建测试环境SQL> drop table test3;Table droppedSQL>SQL> create table test3 as2 select rownum id,3 dbms_random.string('a', round(dbms_random.value(0,10))) col1,4 trunc(sysdate) - dbms_random.value(1, 365*2) col25 from dual connect by rownum<=10000;Table created查看test3的blocks的使用SQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................40Total Bytes.............................327680Unused Blocks...........................3Unused Bytes............................24576Last Used Ext FileId....................31Last Used Ext BlockId...................481921Last Used Block.........................5*************************************************0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............025% -- 50% free space bytes.............050% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................32Total bytes.............................262144PL/SQL procedure successfully completed制造碎片SQL> delete from test3 where mod(id,3)=1;3334 rows deletedSQL>Commit complete查看碎片情况SQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................40Total Bytes.............................327680Unused Blocks...........................3Unused Bytes............................24576Last Used Ext FileId....................31Last Used Ext BlockId...................481921Last Used Block.........................5*************************************************0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............3125% -- 50% free space bytes.............25395250% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................1Total bytes.............................8192PL/SQL procedure successfully completed用oracle10g新功能整理碎片SQL> alter table test3 shrink salter table test3 shrink space compact cascadeORA-10636: ROW MOVEMENT is not enabledSQL> alter table test3Table alteredSQL> alter table test3 shrink sTable altered再次查看碎片的情况,发现还有一些碎片,整理碎片效果不好SQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................40Total Bytes.............................327680Unused Blocks...........................3Unused Bytes............................24576Last Used Ext FileId....................31Last Used Ext BlockId...................481921Last Used Block.........................5*************************************************0% -- 25% free space blocks.............10% -- 25% free space bytes..............819225% -- 50% free space blocks............225% -- 50% free space bytes.............1638450% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........1275% -- 100% free space bytes............98304Unused Blocks...........................0Unused Bytes............................0Total Blocks............................17Total bytes.............................139264PL/SQL procedure successfully completed上面是没降低HWM,如果载降低HWM,看看效果SQL> alter table test3 Table alteredSQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................24Total Bytes.............................196608Unused Blocks...........................0Unused Bytes............................0Last Used Ext FileId....................31Last Used Ext BlockId...................481897Last Used Block.........................8*************************************************0% -- 25% free space blocks.............10% -- 25% free space bytes..............819225% -- 50% free space blocks............225% -- 50% free space bytes.............1638450% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................17Total bytes.............................139264PL/SQL procedure successfully completed看来用shrink space整理碎片不彻底,再来看看move的方式SQL> alter table test3Table alteredSQL> exec show_space_t('TEST3','auto','table','Y');Total Blocks............................32Total Bytes.............................262144Unused Blocks...........................6Unused Bytes............................49152Last Used Ext FileId....................31Last Used Ext BlockId...................485081Last Used Block.........................2*************************************************0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............025% -- 50% free space bytes.............050% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........075% -- 100% free space bytes............0Unused Blocks...........................0Unused Bytes............................0Total Blocks............................22Total bytes.............................180224PL/SQL procedure successfully completed效果很明显,整理的很彻底测试结论:&虽然alter table move和shrink space,都是通过物理调整rowid来整理碎片的,但shrink space整理的不彻底,他好像不是重组,而是尽可能的合并,随意会残留一些block无法整理注意:1.再用alter table table_name move时,表相关的索引会失效,所以之后还要执行 alter index index_ 最后重新编译数据库所有失效的对象2. 在用alter table table_name shrink space cascade时,他相当于alter table table_name move和alter index index_name rebuild online. 所以只要编译数据库失效的对象就可以&alter table move和shrink space除了碎片整理的效果有时不一样外,还有什么其他的不同呢&1. Move会移动高水位,但不会释放申请的空间,是在高水位以下(below HWM)的操作。2. shrink space 同样会移动高水位,但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作。下面通过实验来验证SQL> drop table test3;Table droppedSQL>SQL> create table test3 as2 select rownum id,3 dbms_random.string('a', round(dbms_random.value(0,10))) col1,4 trunc(sysdate) - dbms_random.value(1, 365*2) col25 from dual connect by rownum<=10000;Table createdSQL> analyze table test3Table analyzedSQL> col segment_name for a10;SQL> select us.segment_name,us.extents,us.blocks from user_segments us where us.segment_name=upper('test3');SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST3 5 40SQL> col table_name for a10;SQL> select table_name,blocks,t.empty_blocks from user_tables t where t.table_name=upper('test3');TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST3 37 3SQL>从以上查询可以看出共分了5个extents,使用了37个blocks,这37也就是test3的HWM&SQL> delete from test3 where rownum<=5000;5000 rows deletedSQL>Commit completeSQL> analyze table test3Table analyzedSQL> col segment_name for a10;SQL> select us.segment_name,us.extents,us.blocks from user_segments us where us.segment_name=upper('test3');SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST3 5 40SQL> col table_name for a10;SQL> select table_name,blocks,t.empty_blocks from user_tables t where t.table_name=upper('test3');TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST3 37 3SQL> select count(distinct dbms_rowid.rowid_block_number(rowid)) used_blocks from test3;USED_BLOCKS-----------17我们从查询中可以发现test3的HWM没有变换还是37blocks,tests总共空间为40blocks。经过删除后test3实际用的块是17个&下面我们用move降低下HWMSQL> alter table test3Table alteredSQL> col segment_name for a10;SQL> select us.segment_name,us.extents,us.blocks from user_segments us where us.segment_name=upper('test3');SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST3 3 24SQL> col table_name for a10;SQL> select table_name,blocks,t.empty_blocks from user_tables t where t.table_name=upper('test3');TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST3 37 3user_tables里的数据没有变化,哦,原来是忘记analyze了,从这里也可以看出user_segments是oracle自动维护的。&SQL> analyze table test3Table analyzedSQL> select us.segment_name,us.extents,us.blocks from user_segments us where us.segment_name=upper('test3');SEGMENT_NA EXTENTS BLOCKS---------- ---------- ----------TEST3 3 24SQL> select table_name,blocks,t.empty_blocks from user_tables t where t.table_name=upper('test3');TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST3 20 4SQL>现在再来看hwm变为20了,已经降下来了啊,空间也收缩了,从40blocks降到24blocks(注意收缩到initial指定值)。但shrink space就收缩到存储数据的最小值,下面测试说明创建测试表:SQL> create table test5 (id number) storage (initial 1m next 1m);Table created初始化数据SQL>SQL> begin2 for i in 1..100000 loop3 insert into test5 values(i);456 /PL/SQL procedure successfully completedSQL> analyze table test5Table analyzedSQL> select SEGMENT_NAME,EXTENTS,BLOCKS,INITIAL_EXTENT/ init from user_segments where SEGMENT_NAME='TEST5';SEGMENT_NA EXTENTS BLOCKS INIT---------- ---------- ---------- ----------TEST5 17 256 1SQL> select TABLE_NAME,BLOCKS,EMPTY_BLOCKS from user_tables where table_name='TEST5';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST5 180 76&可以从查询数据看出,test5初始化1m即128个blocks,但数据比较多,所以又按next参数要求扩展了1m空间,扩展了17个extents。这里的test5总空间大小为256个blocks,使用空间为180blocks,HWM也是180blocksSQL> delete from test5 where rownum<=50000;50000 rows deletedSQL> analyze table test5Table analyzedSQL> select SEGMENT_NAME,EXTENTS,BLOCKS,INITIAL_EXTENT/ init from user_segments where SEGMENT_NAME='TEST5';SEGMENT_NA EXTENTS BLOCKS INIT---------- ---------- ---------- ----------TEST5 17 256 1SQL> select TABLE_NAME,BLOCKS,EMPTY_BLOCKS from user_tables where table_name='TEST5';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST5 180 76整理碎片,降低HWMSQL> alter table test5Table alteredSQL> analyze table test5Table analyzedSQL> select SEGMENT_NAME,EXTENTS,BLOCKS,INITIAL_EXTENT/ init from user_segments where SEGMENT_NAME='TEST5';SEGMENT_NA EXTENTS BLOCKS INIT---------- ---------- ---------- ----------TEST5 16 128 1SQL> select TABLE_NAME,BLOCKS,EMPTY_BLOCKS from user_tables where table_name='TEST5';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST5 85 43从上面的查询数据可以看出HWM已经从180降低到85,test5总大小从256blocks收缩到128个blocks(initial指定大小)。下面看看用shrink space收缩空间的情况SQL> alter table test5Table alteredSQL> alter table test5Table alteredSQL> select SEGMENT_NAME,EXTENTS,BLOCKS,INITIAL_EXTENT/ init from user_segments where SEGMENT_NAME='TEST5';SEGMENT_NA EXTENTS BLOCKS INIT---------- ---------- ---------- ----------TEST5 11 88 1SQL> select TABLE_NAME,BLOCKS,EMPTY_BLOCKS from user_tables where table_name='TEST5';TABLE_NAME BLOCKS EMPTY_BLOCKS---------- ---------- ------------TEST5 85 43SQL>从上面的数据可以看到test5进一步从128个blocks降低到88个blocks结论:shrink space收缩到数据存储的最小值,alter table move(不带参数)收缩到initial指定值,也可以用alter table test5 move storage(initial 500k)指定收缩的大小,这样可以达到shrink space效果&经过以上测试,得出的两个结论,到底用哪一个命令来整理碎片,消除行迁移呢?这就要根据实际业务需要,如果你只是收缩空间,数据增长很慢,那用shrink可以但是如果数据增长很快的话,用move就比较合适,避免再重新分配空间啊&备注:在10g之后,整理碎片消除行迁移的新增功能shrink spacealter table
shrink space [
| compact | cascade ];compact:这个参数当系统的负载比较大时可以用,不降低HWM。如果系统负载较低时,直接用alter table table_name shrink space就一步到位了cascade:这个参数是在shrink table的时候自动级联索引,相当于rebulid index。普通表:&shrink必须开启行迁移功能。alter table table_name 保持HWM,相当于把块中数据打结实了alter table table_name 回缩表与降低HWMalter table table_回缩表与相关索引,降低HWMalter table table_name 回缩索引与降低HWMalter index index_name shrink space虽然在10g中可以用shrink ,但也有些限制:1). 对cluster,cluster table,或具有Long,lob类型列的对象 不起作用。2). 不支持具有function-based indexes 或 bitmap join indexes的表3). 不支持mapping 表或index-organized表。4). 不支持compressed 表
阅读(892) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 alter table shrink 的文章

 

随机推荐