分区表XYSTOW
增加2011年分区
create tablespace USER_DATA_2011 DATAFILE 'E:\ORADATA\ORCL\USERDATA2011_01.DBF' SIZE 100M autoextend
on;
/
ALTER TABLE xystow SPLIT PARTITION PT_XYSTOW_2010 AT TO_DATE('2011-01-01 00:00:00', 'YYYY-MM-DD
HH24:MI:SS') INTO (partition PT_XYSTOW_2010 tablespace PT_XYSTOW_2010, partition PT_XYSTOW_2011 PT_XYSTOW_2011) ;
发现文件E:\ORADATA\ORCL\USERDATA2011_01.DBF 自动扩展到了481M。
alter table xystow enable row movement
alter index xystow_key rebuild
alter table xystow SHRINK SPACE CASCADe
回收表空间成功后查看表空间的使用率,已经接近0,执行
alter database datafile 'E:\ORADATA\ORCL\USERDATA2011_01.DBF' resize 100m;试图回收多余的空间
但是报错:
ORA-03297: file
contains used data beyond requested RESIZE value 查 select file_id, block_id first_block, block_id+blocks-1
last_block, segment_name
from dba_extents
where tablespace_name = 'USER_DATA_2011'
union all
select file_id, block_id, block_id+blocks-1, 'free'
from dba_free_space
where tablespace_name = 'USER_DATA_2011'
order by file_id, first_block
FILE_ID FIRST_BLOCK LAST_BLOCK SEGMENT_NAME
1 24 9 62480 free
2 24 62481 62488 XYSTOW
3 24 62489 62592 free
可以看到xystow占用了62488的block,所以最后的free空间可以回收,前面的free空间就无法回收了。
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
计算62488*8k/1024=488.1875
说明最大块占用了488.1875的空间,这部分空间不能通过降低HWM来回收。
执行 ALTER TABLE XYSTOW MOVE PARTITION PT_XYSTOW_2011 之后再查询,发现
FILE_ID FIRST_BLOCK LAST_BLOCK SEGMENT_NAME
1 24 9 62472 free
2 24 62473 62480 XYSTOW
3 24 62481 62592 free
xystow块往前移了7个块
move table后要重建索引。ps:补充说明shrink space的原理
实际上就是将数据往前移动。就是delete与insert操作,数据的内容不变,但是rowid变了。
在shrink之前要enable row movement
另外shrink space还可以加几个参数。
alter table
shrink space compcat;
收缩表,但会保持 high water mark;
alter table shrink space;
收缩表,降低 high water mark;
alter table shrink space cascade;
收缩表,降低 high water mark,并且相关索引也要收缩一下下。
几个的比较:
MOVE SHRINK 这两个用于回收水位以下的块 ------------------------------------------- DEALLOCATE UNUSERD 用户回收高水位以上的块 |
|
阅读(1430) | 评论(0) | 转发(0) |