喜欢就来多看看

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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-01-26  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 36
  • 日志数: 1128
  • 图片数: 1
  • 书签数: 1
  • 建立时间: 2007-12-13
  • 更新时间: 2008-01-01

RSS订阅

Open Toolbar