Oracle 删除数据后释放数据文件所占磁盘空间

测试的时候向数据库中插入了大量的数据,测试完成后删除了测试用户以及其所有数据,可是数据文件却没有缩小。
经查阅资料以后发现这是 Oracle “高水位”所致,那么怎么把这些数据文件的大小降下来呢?
解决办法以下:html

 

概念:sql

表空间的相关知识请见这里http://www.cnblogs.com/fnng/archive/2012/08/12/2634485.html,详细的介绍了 Oracle 数据库的存储结构。数据库

 

高水位:
High Water Mark (HWM),是段(Segment)的一个指标,界定了段(Segment)曾经配置过的 block 水位。oracle

 

听说,随着数据的 insert,所使用段(Segment)的数据块(data block)也不断增长,这时候高水位(HWM)也随着上升。当数据被删除后(不管是 delete 仍是 truncate table)虽然被占用的数据块(data block)已经相应减小,可是高水位(HWM)并不会随之降低。当高水位(HWM)下存在大量的空白数据块(data block)时,若是发生全表扫描(Full Table Scan, FTS)就会形成不少额外的 IO。由于全表扫描(FTS)的时候读取段(Segment)中的数据块(data block)会一直读取到高水位(HWM)才结束。高水位(HWM)就是段(Segment)中数据块(data block)有没有使用的分界线,因此全表扫描(FTS)所花费的时间不但不会由于数据的删除而减小,反而会增长。(关于此段查询效率的内容有待验证,笔者未亲自验证。不过能够肯定的是高水位确实不会随着数据的删除而降低。)测试

 

下降高水位的正确作法是先下降HWM,再肯定实际占有大小,再resize数据文件。大数据

 

数据文件比较多,咱们用其中一个较大的文件作为 Demo,其它数据文件如法炮制便可。我选择的文件是:D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF 1.4GB 左右。spa

 

1.登陆 sqlplus:.net

语法:sqlplus username/password@hostname:port/sidhtm

例:sqlplus system/orcl@localhost:1521/orclblog


2.查询这个数据文件的编号:

SQL> select file#, name from v$datafile;

FILE# NAME

------------------------------------------------------------------------------------------

1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF

2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF

3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF

4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF

 能够看到,咱们要操做的数据文件的编号是4。

 

2.根据文件 ID 查询这个数据文件最大数据块(data block)的编号:(彷佛这个最大编号能够表明该数据文件中数据块的数量,这一点有待考证。)

SQL> select max(block_id) from dba_extents where file_id=4; 

MAX(BLOCK_ID)

-------------

65673

 

3.计算该表空间实际占用的空间:

--查询数据块的大小,单位是 byte

SQL> show parameter db_block_size;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_block_size integer 8192

--8192 byte = 8 kb

--接下来计算该表空间占用的物理空间

SQL> select 65673 * 8 / 1024 from dual;

65673*8/1024

------------

513.070313

--实际占用的物理空间是 513MB 多点

 

4.最后一步,把咱们的数据文件尺寸修改得比这个表空间实际占用的物理空间大点就好了:

SQL> alter database datafile 'D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF' resize 600m;

数据库已更改。

OK,数据文件从修改前的 1.4GB 变成了 600MB。对于其它的数据文件,你们也知道如何收缩了吧?

转自:http://blog.itpub.net/26845409/viewspace-1696903/