Home > September, 2015 存档

oracle删除数据后,空间释放

评分 5.00, 满分 5星 1 票 No comments

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