Oracle 高水位(watermark)实验

oracle 中的高水位标记是 oracle table 中使用的术语,用于显示在 oracle table 的生命周期中曾经使用过的块。
当您从表中删除行时,HWM 下面的块可能会变为空,但高水位标记将保持原样。假设您加载了 100 万行的表。现在您将假设高水位标记为 1 GB。现在,如果您删除所有 100 万行,那么即使是高水位标记也将保持与 1 GB 相同。减少HWM 的唯一方法是重建table 、truncate 表。或者使用alter table shrink space 收缩表,Oracle 截断表减少高水位标记

这里使用shrink space去重置水位线:
1.由于计算水位线的sql需要使用到统计信息,为了计算准确,现收集最新的统计信息
execute dbms_stats.gather_schema_stats(‘Owner’)
1.使用如下sql定位高水位的table
SELECT NUM_ROWS,ROUND(AVG_ROW_LENNUM_ROWS/1024/1024/0.9,2) Actual_used, BLOCKS8/1024 Watermark,ROUND((BLOCKS8/1024-AVG_ROW_LENNUM_ROWS/1024/1024/0.9),2) wasted_space,TABLE_NAME
FROM dba_tables WHERE OWNER=‘IDPCS’ AND BLOCKS8/1024-AVG_ROW_LENNUM_ROWS/1024/1024/0.9>100
AND rownum<11 order by wasted_space desc;Oracle 高水位(watermark)实验_第1张图片
3.如上图中的表PCS_DJ_IN,有超过5GB的空间浪费,可以使用
alter table TABLE_NAME enable ROW MOVEMENT;–启动行迁移功能
alter table TABLE_NAME shrink space
alter table TABLE_NAME disable ROW MOVEMENT 最后记得disable row movement

关于shrink space其它语法参考:
alter table shrink space compcat;
收缩表,相当于把块中数据打结实了,但会保持 high water mark;
alter table shrink space;
收缩表,降低 high water mark;
alter table shrink space cascade;
收缩表,降低 high water mark,并且相关索引也要收缩一下下。
alter index idxname shrink space;
回缩索引

需要注意的是,Shrink 操作需满足表空间是本地管理和自动段空间管理(10g、11g默认就是这样),以下情况不能用shrink:
IOT索引组织表
用rowid创建的物化视图的基表
带有函数索引的表
SECUREFILE 大对象
压缩表
否则会出现ORA-10631的錯誤

补充,对于ASSM tablesapce的表也可以使用如下procedure检查块的分布,这里我使用上图中的PCS_DJ_IN去检查block分布
set serveroutput on
declare
v_unformatted_blocks number;
v_unformatted_bytes number;
v_fs1_blocks number;
v_fs1_bytes number;
v_fs2_blocks number;
v_fs2_bytes number;
v_fs3_blocks number;
v_fs3_bytes number;
v_fs4_blocks number;
v_fs4_bytes number;
v_full_blocks number;
v_full_bytes number;

begin
dbms_space.space_usage (
‘&table_owner’,
‘&table_name’,
‘TABLE’,
v_unformatted_blocks,
v_unformatted_bytes,
v_fs1_blocks,
v_fs1_bytes,
v_fs2_blocks,
v_fs2_bytes,
v_fs3_blocks,
v_fs3_bytes,
v_fs4_blocks,
v_fs4_bytes,
v_full_blocks,
v_full_bytes);

dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
dbms_output.put_line('Blocks with 00-25% free space = '||v_fs1_blocks);
dbms_output.put_line('Blocks with 26-50% free space = '||v_fs2_blocks);
dbms_output.put_line('Blocks with 51-75% free space = '||v_fs3_blocks);
dbms_output.put_line('Blocks with 76-100% free space = '||v_fs4_blocks);
dbms_output.put_line('Full Blocks = '||v_full_blocks);
end;
输出结果如下:
Oracle 高水位(watermark)实验_第2张图片
NON-ASSM tablespace使用如下procedure
set serveroutput on
declare
TOTAL_BLOCKS number;
TOTAL_BYTES number;
UNUSED_BLOCKS number;
UNUSED_BYTES number;
LAST_USED_EXTENT_FILE_ID number;
LAST_USED_EXTENT_BLOCK_ID number;
LAST_USED_BLOCK number;
HWM number;
FREE_BLOCKS number;

begin
dbms_space.unused_space(
‘&table_owner’,
‘&table_name’,
‘TABLE’,
TOTAL_BLOCKS,
TOTAL_BYTES,
UNUSED_BLOCKS,
UNUSED_BYTES,
LAST_USED_EXTENT_FILE_ID,
LAST_USED_EXTENT_BLOCK_ID,
LAST_USED_BLOCK);

dbms_space.free_blocks
( ‘&table_owner’,
‘&table_name’,
‘TABLE’,
0,
FREE_BLOCKS);

dbms_output.put_line('TOTAL_BLOCKS = '||TOTAL_BLOCKS);
dbms_output.put_line('UNUSED_BLOCKS = '||UNUSED_BLOCKS);
HWM= TOTAL_BLOCKS - UNUSED_BLOCKS -1;
dbms_output.put_line('HIGH WATER MARK = '||HWM);
dbms_output.put_line('FREE BLOCKS = '|| FREE_BLOCKS);
end;
/

你可能感兴趣的:(Oracle,数据库,dba)