喜欢就来多看看
Oracle 10g的新功能 之1 -将段缩小
上一篇 /
下一篇 2007-02-13 00:00:00
/ 个人分类:11g&Grid
Oracle 10g的新功能中有很多是以自动管理为主题,以后我们有机会将一一讲解。最近我接触到空间重整的工作,所以就以此为例来介绍Oracle 10g在这个方面上的新特性。
大家在某个表上进行大量删除(delete)动作之后,会以什么方法将high water mark的值降下来呢?一般使用的方法是:
1.exp/imp
2.alter table xxx move
等等,不过, Oracle 10g增加了新方法:alter table xxx shrink space 命令。
运行将段缩小的命令,可以释放high water mark之下的空闲空间,调整high water mark的值。受支持的数据库对象有下面几种:
1.表(table)
2.索引(index)
3.具体化视图(materialized view)
4.具体化视图日志(materialized view log)
数据库对象的存放位置必须是在设定了自动段管理(automatic segment management)的本地(local)管理表空间(即数据库对象的储存参数必须设定为automatic segment management,local管理)。
环境
Linux 2.4.9-e.24enterprise
Oracle10g EE Release 10.1.0.2.0
试用将段缩小的命令 SQL> select owner,segment_name,bytes,blocks,extents from dba_segments
where segment_name = 'EMP';
OWNER SEGMENT_NAME BYTES BLOCKS EXTENTS
----- ------------ ---------- ---------- ----------
SCOTT EMP 53477376 6528 66
SQL> alter table emp shrink space;
ORA-10636: ROW MOVEMENT is not enabled
|
要将段缩小必须执行“行移动”,因此要执行这个命令,要缩小的数据库对象必须要能进行行移动。
SQL> alter table emp enable row movement;
Table altered.
SQL> alter table emp shrink space;
Table altered.
SQL> select owner,segment_name,bytes,blocks,extents from dba_segments
where segment_name = 'EMP';
OWNER SEGMENT_NAME BYTES BLOCKS EXTENTS
----- ------------ ---------- ---------- ----------
SCOTT EMP 65536 8 1
|
也许有读者会觉得,这不是和alter table xxx move命令一样吗?其实Oracle 10g增加的整个功能还是与之有所不同的。
alter table xxx shrink space 和 alter table xxx move
# 差异点1. 可在线执行
SES1>alter table emp move;
SES2>select l.oracle_username,o.name objname,l.locked_mode from v$locked_object l,obj$ o
where l.object_id=o.obj#;
ORACLE_USERNAME OBJNAME LOCKED_MODE
------------------------------ ------------------------------ -----------
SCOTT EMP 6
SES2>select rownum from scott.emp where rownum=1 for update nowait;
ORA-00054: 资源忙碌,NOWAIT被指定了。
SES1> alter table emp shrink space;
SES2> select l.oracle_username,o.name objname,l.locked_mode from v$locked_object l,obj$ o
where l.object_id=o.obj#;
ORACLE_USERNAME OBJNAME LOCKED_MODE
------------------------------ ------------------------------ -----------
SCOTT EMP 3
SES2>select rownum from scott.emp where rownum=1 for update nowait;
ROWNUM
----------
1
|
shrink命令与move命令不同,不会对数据库对象产生排他锁。请看LOCKED_MODE的地方。实行move命令的时候,会执行“'6'=排他锁模式”,但是执行shrink命令的时候会执行“'3'=行锁模式”。因此,不需要停止工作也能执行重整,不过通常最好还是在非繁忙时间进行这项工作比较好。
# 差异点2. 即使中途将命令中断,段也会被缩小。
(1)将SCOTT.EMP段缩小。
以dbms_space.space_usage procedure导出缩小前值
Segment Owner = SCOTT
Segment Name = EMP
Unformatted Blocks = 16
0 - 25% free blocks= 0
25- 50% free blocks= 6366
50- 75% free blocks= 0
75-100% free blocks= 36
Full Blocks = 0
|
(2)缩小的过程中强制结束
SQL> alter table emp shrink space;
ORA-00028: your session has been killed
|
(3)强制结束之后导出值
Segment Owner = SCOTT
Segment Name = EMP
Unformatted Blocks = 16
0 - 25% free blocks= 1
25- 50% free blocks= 2808
50- 75% free blocks= 0
75-100% free blocks= 1004
Full Blocks = 2553
|
(4)再次执行shrink命令,正常结束后导出值
Segment Owner = SCOTT
Segment Name = EMP
Unformatted Blocks = 0
0 - 25% free blocks= 1
25- 50% free blocks= 2
50- 75% free blocks= 0
75-100% free blocks= 0
Full Blocks = 4567
|
以dbms_space.space_usage procedure导出的值的变化
1.缩小之前
没有任何Full Block,几乎所有数据块的空闲比例都很高。
2.缩小的过程中强制结束
正在执行缩小的时候**% free blocks变比比较少,Full Block增加。
3.缩小结束后
**% free block几乎都不见了,而且数据块整体减少到大约70%,可见high water mark已经降低了。空间重整是绝对必要的,即使没有足够时间维护系统,也可以分成几次慢慢进行重整。
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: