高水位标记
什么是高水位标记
表的高水位标记指出该表所使用过的最后一个块
在向表中插入数据时高水位标记会移动以标记所使用的最后一个块
从表中删除行时高水位标记不会重新设置
高水位标记存储在表的段头部
当 Oracle 服务器执行全表扫描时它会读取高水位标记以下的所有块
语法
下面的 PL/SQL 块可用来查找并打印分配给表的块数和未使用的块数
SQL> DECLARE
2 v_owner VARCHAR2(30) := 'SUMMIT' ;
3 v_segment_name VARCHAR2(30) := 'EMPLOYEE';
4 v_segment_type VARCHAR2(30) := 'TABLE';
5 v_total_blocks NUMBER;
6 v_total_bytes NUMBER;
7 v_unused_blocks NUMBER;
8 v_unused_bytes NUMBER;
9 v_last_used_extent_file_id NUMBER;
10 v_last_used_extent_block_id NUMBER;
11 v_last_used_block NUMBER;
12 BEGIN
13 dbms_space.unused_space(v_owner,
14 v_segment_name,
15 v_segment_type,
16 v_total_blocks,
17 v_total_bytes,
18 v_unused_blocks,
19 v_unused_bytes,
20 v_last_used_extent_file_id,
21 v_last_used_extent_block_id,
22 v_last_used_block
23 );
24 dbms_output.put_line(INITCAP(v_segment_type)||'
:'||v_owner||'.'||v_segment_name);
25 dbms_output.put_line('Total Blocks
:'||TO_CHAR(v_total_blocks));
26 dbms_output.put_line('Blocks above HWM
:'||TO_CHAR(v_unused_blocks));
27 END;
28 /
Statement processed.
Table :SUMMIT.EMPLOYEE
Total Blocks : 25
Blocks above HWM : 23
注DBMS_SPACE 程序包是在 catproc.sql 调用 dbmsutil.sql 和
prvtutil.plb 这两个脚本时创建的
获取高水位标记的例子
DECLARE
v_owner VARCHAR2(30) := 'INSUR_CHANGDE' ;
v_segment_name VARCHAR2(30) := 'BS_INSURED';
v_segment_type VARCHAR2(30) := 'TABLE';
v_total_blocks NUMBER;
v_total_bytes NUMBER;
v_unused_blocks NUMBER;
v_unused_bytes NUMBER;
v_last_used_extent_file_id NUMBER;
v_last_used_extent_block_id NUMBER;
v_last_used_block NUMBER;
BEGIN
dbms_space.unused_space(v_owner,
v_segment_name,
v_segment_type,
v_total_blocks,
v_total_bytes,
v_unused_blocks,
v_unused_bytes,
v_last_used_extent_file_id,
v_last_used_extent_block_id,
v_last_used_block
);
dbms_output.put_line(INITCAP(v_segment_type)||':'||v_owner||'.'||v_segment_name);
dbms_output.put_line('Total Blocks:'||TO_CHAR(v_total_blocks));
dbms_output.put_line('Blocks above HWM:'||TO_CHAR(v_unused_blocks));
END;
Table:INSUR_CHANGDE.BS_INSURED
Total Blocks:57344
Blocks above HWM:40448
回收未使用空间
如果已为表分配了大量区但这些区未完全使用则可以手动从表中回收空
间所释放的空间可供表空间中的其它段使用
语法
使用下面的命令回收表中未使用空间
ALTER TABLE [schema.]table
DEALLOCATE UNUSED [KEEP integer [ K|M ] ]
KEEP 指定在高水位标记以上应该保留的字节数
如果使用上述命令时没有 KEEP 子句Oracle 服务器将回收高水位标记以上所
有未使用空间如果高水位标记所在的区小于 MINEXTENTS 的值Oracle 服
务器将释放 MINEXTENTS 以上的区
注
因为使用此命令回收空间可以释放区内未使用的空间所以频繁使用此命令
可能会导致数据文件中产生碎片若要避免出现此问题请为表空间设置
MINIMUM EXTENT
若要释放高水位标记以下的所有空间即使高水位标记在 MINEXTENTS
以下请使用 KEEP 0
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26015009/viewspace-717675/,如需转载,请注明出处,否则将追究法律责任。