日期:2014-05-16  浏览次数:20414 次

Oracle Move命令总结

Oracle Move命令总结

从8i开始,oracle开始提供Move的命令。我们通常使用这个命令,将一个table segment从一个tablespace移动到另一个tablespace。Move实际上是在block之间物理的copy数据,那么,我们可以通过这种方式来降低table的HWM。我们先通过一个实验来看看move是如何移动数据的。

1.建表并插入数据:

SQL> create table sjh.test1(id int) tablespaceusers;

表已创建。

SQL> insert into sjh.test1 values(1);

已创建 1 行。

SQL> insert into sjh.test1 values(2);

已创建 1 行。

SQL> insert into sjh.test1 values(3);

已创建 1 行。

SQL> insert into sjh.test1 values(4);

已创建 1 行。

SQL> insert into sjh.test1 values(5);

已创建 1 行。

SQL> insert into sjh.test1 values(6);

已创建 1 行。

SQL> insert into sjh.test1 values(7);

已创建 1 行。

SQL> insert into sjh.test1 values(8);

已创建 1 行。

S QL> commit;

提交完成。

SQL> select * from sjh.test1;

已选择8行。

2.查看表的rowid信息和block id信息:

SQL> select rowid,id from sjh.test1;

已选择8行。

SQL> select EXTENT_ID,FILE_ID,RELATIVE_FNO,BLOCK_ID,BLOCKS

--8条记录都在一个块上(AAAABH)

这里简单介绍一下ROWID的知识:ROWID在磁盘上需要10个字节的存储空间并使用18个字符来显示它包含下列组件:

数据对象编号:每个数据对象如表或索引在创建时都分配有此编号,并且此编号在数据库中是唯一的;

相关文件编号:此编号对于一个表空间中的每个文件是唯一的;

块编号:表示包含此行的块在文件中的位置;

行编号:标识块头中行目录位置的位置;

在内部数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,加起来总共是80 位或10 个字节,ROWID使用以64 为基数的编码方案来显示该方案将六个位置用于数据对象,编号三个位置用于相关文件编号六个位置用于块编号三个位置用于行编号以64 为基数的编码方案使用字符A-Z a-z 0-9 + 和/共64 个字符,

如下例所示:AAAMlQAAE AAAABH AAA

3.做一些DML操作,再观察ROWID有没有发生变化:

SQL> delete from sjh.test1 where id=1;

已删除 1 行。

SQL> delete from sjh.test1 where id=3;

已删除 1 行。

SQL> delete from sjh.test1 where id=5;

已删除 1 行。

SQL> commit;

提交完成。

SQL> select rowid,id from sjh.test1;

--我们看到ROWID保持不变。

4.做MOVE操作,然后观察ROWID的情况:

SQL> alter table sjh.test1 move;

表已更改。

SQL> select rowid,id from sjh.test1;

--ROWID发生变化BLOCK_ID由原来的65变为73,BLOCK的编号由原来的AAAABH变为AAAABM

5.move对HWM的影响:

这里引用网友yjz0065的一个例子:

SQL> create table my_objects tablespace HWM

SQL> delete from my_objects where rownum<10000;

9999 rows deleted

SQL> select count(*) from my_objects;

COUNT(*)

----------

SQL> exec show_space(p_segname =>'MY_OBJECTS',p_owner => 'DLINGER',p_type => 'TABLE');

Total Blocks............................425

Total Bytes.............................3481600

Unused Blocks...........................3

Unused Bytes............................24576

Last Used Ext FileId....................11

Last Used Ext BlockId...................1294

Last Used Block.........................2

这里HWM=425- 3 + 1 = 423


然后对