Oracle 在删除数据后,因为高水位线的问题,并不会 自动释放空间。
所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为”high water mark”或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。
-- --查看hwm select file_name, ceil((nvl(hwm, 1) * 8192) / 1024 / 1024) as "HWM(MB)" from dba_data_files a, (select file_id, max(block_id + blocks - 1) hwm from dba_extents group by file_id) b where a.file_id = b.file_id(+); --查看hwm 信息全 SELECT * FROM (SELECT /*+ ordered use_hash(a,b,c) */ a.file_id, a.file_name, a.filesize, b.freesize, (a.filesize - b.freesize) usedsize, c.hwmsize, c.hwmsize - (a.filesize - b.freesize) unsedsize_belowhwm, a.filesize - c.hwmsize canshrinksize FROM (SELECT file_id, file_name, round(bytes / 1024 / 1024) filesize FROM dba_data_files) a, (SELECT file_id, round(SUM(dfs.bytes) / 1024 / 1024) freesize FROM dba_free_space dfs GROUP BY file_id) b, (SELECT file_id, round(MAX(block_id) * 8 / 1024) HWMsize FROM dba_extents GROUP BY file_id) c WHERE a.file_id = b.file_id AND a.file_id = c.file_id ORDER BY unsedsize_belowhwm DESC) WHERE file_id IN (SELECT file_id FROM dba_data_files WHERE tablespace_name = 'DMSB_01') ORDER BY file_id; --释放 alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\D_TEST1' resize 600m;
高水位详解,引自:http://www.cnblogs.com/linjiqin/archive/2012/01/15/2323030.html