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