ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 什么是高水位标记

什么是高水位标记

原创 Linux操作系统 作者:eric0435 时间:2012-03-04 23:47:15 0 删除 编辑
高水位标记
什么是高水位标记
 表的高水位标记指出该表所使用过的最后一个块
 在向表中插入数据时高水位标记会移动以标记所使用的最后一个块
 从表中删除行时高水位标记不会重新设置
 高水位标记存储在表的段头部
 当 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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
系统架构师,ACOUG MEMBER,Oracle ACE,Mail:yongjing.star@gmail.com Mobile:13875984558 QQ:409898894 Blog:www.jydba.net

注册时间:2011-10-12

  • 博文量
    509
  • 访问量
    6096289