如何降低表的HWM

转载 2013年12月06日 12:06:58

(HWM=total_blocks-Unused Blocks+1)
可以在DUMP文件第一个EXTENT的前三个数据块中看到HWM.

释放在HWM之上的空闲BLOCK:
alter table table_name deallocate usused;

在HWM之下的空闲块:
1. 了解一个table在HWM下有多少blocks是不包含数据的.
analyze table &t_name compute statistics;
select (1-a.num/b.num_total)*100 as percent from 
(select count(distinct substr(rowid,1,15)) num from &t_name ) a,
(select blocks-empty_blocks num_total from user_tables wheretable_name='&t_name' )b 

在ASSM下,free space分别为0-25%,25-50%..BLOCK使用情况.
create or replace procedure show_space_assm(
p_segname in varchar2,
p_owner in varchar2 default user,
p_type in varchar2 default 'TABLE')
as 
l_fs1_bytes number; 
l_fs2_bytes number; 
l_fs3_bytes number; 
l_fs4_bytes number; 
l_fs1_blocks number; 
l_fs2_blocks number; 
l_fs3_blocks number; 
l_fs4_blocks number; 
l_full_bytes number; 
l_full_blocks number; 
l_unformatted_bytes number; 
l_unformatted_blocks number; 

procedure p(p_label in varchar2,p_num in number)
is 
begin 
dbms_output.put_line(rpad(p_label,40,'.') || p_num );
end;

begin 
dbms_space.space_usage( 
segment_owner => p_owner, 
segment_name => p_segname, 
segment_type => p_type, 
fs1_bytes => l_fs1_bytes, 
fs1_blocks => l_fs1_blocks, 
fs2_bytes => l_fs2_bytes, 
fs2_blocks => l_fs2_blocks, 
fs3_bytes => l_fs3_bytes, 
fs3_blocks => l_fs3_blocks, 
fs4_bytes => l_fs4_bytes, 
fs4_blocks => l_fs4_blocks, 
full_bytes => l_full_bytes, 
full_blocks => l_full_blocks, 
unformatted_blocks => l_unformatted_blocks, 
unformatted_bytes => l_unformatted_bytes ); 
p('free space 0-25% blocks:',l_fs1_blocks);
p('free space 25-50% blocks:',l_fs2_blocks);
p('free space 50-75% blocks:',l_fs3_blocks);
p('free space 75-100% blocks:',l_fs4_blocks);
p('Full Blocks:','l_full_blocks);
p('Unformatted blocks:',l_unformatted_blocks);
end; 
/

降低HWM的方法:
(一) MOVE (need rebuild all indexes,有DLL锁,需要两倍空间)
alter table TABLE_NAME move;
alter table TABLE_NAME move tablespace TABLESPACE_NAME;

(二) DBMS_REDEFINITION 联机重定义

Oracle 9i 之后可以进行联机重定义表(Online Redefine Tables,或"在线重定义表").该特性从某种程度上提供了一定的高可用性.通过该功能可以做到:

修改表的存储参数
移动该表到相同 Schema 下的 不同表空间内
添加并行查询支持
添加或删除分区
重建表以便减少碎片
在普通表和索引组织(index-organized)表之间互相转换
添加或删除列
做一个从普通表到分区表之间的转换操作.可以用 DBA 用户操作.如果是普通用户需要有DBMS_REDEFINITION 包的可执行权限以及如下权限:

* CREATE ANY TABLE 
* ALTER ANY TABLE 
* DROP ANY TABLE 
* LOCK ANY TABLE 
* SELECT ANY TABLE 下面通过一个例子来简单演练一把.假定目前产品库有一个非分区表 TEST. 准备对把该表联机修改为分区表.

我们的测试表结构(ID列为PK):

SQL> DESC TEST
Name Null? Type
----------------------------------------- -------- -------------------
ID NOT NULL VARCHAR2(16)
USER_NAME VARCHAR2(16)
GMT NOT NULL TIMESTAMP(6)
1) 验证该表是否可以进行联机重定义(如果不可以会给出具体原因):


SQL> execDBMS_REDEFINITION.can_REDEF_TABLE('SCOTT','TEST',1);

2) 创建中间临时表并划分分区: 

CREATE TABLE test_p(
ID VARCHAR2(16) NOT NULL,
user_name VARCHAR2(16),
gmt TIMESTAMP(6) NOT NULL
)
PARTITION BY RANGE (gmt) (
PARTITION test_p200511 VALUES LESS THAN(TO_DATE('2005-12-01','yyyy-mm-dd')) ,
PARTITION test_p200512 VALUES LESS THAN(TO_DATE('2006-01-01','yyyy-mm-dd')));3) 开始重定义表 

BEGIN
DBMS_REDEFINITION.start_redef_table
('SCOTT','TEST','TEST_P',
'ID ID,
USER_name USER_name,
GMT GMT',
DBMS_REDEFINITION.cons_use_pk
);
END;
-- 注意条件dbms_redefinition.cons_use_pk, 如果是根据 ROWID 做联机重定义,则用 dbms_redefinition.cons_use_rowid .

4) 创建索引限制以及触发器等.注:在10g 中,如果这些定义变化了.可以通过DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT() 来创建.如果这些对象定义不变化,则调用DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS() 即可.

ALTER TABLE test_p
ADD CONSTRAINT test_p_pk PRIMARY KEY (ID)
USING INDEX
TABLESPACE indx;
5) 同步表内容 . 如果需要同步的数据特别大,则可能考虑通过 prebuilt table 的方法先建立物化视图. 
EXEC DBMS_REDEFINITION.sync_interim_table ('SCOTT', 'test', 'test_p');
6) 结束重定义过程
EXEC DBMS_REDEFINITION.finish_redef_table ('scott', 'test', 'test_p');
7) 删除临时表 TEST_P.

drop table test_p;
*) 如果想中途停止重定义过程,则通过如下指令退出该过程:

EXEC dbms_redefinition.abort_redef_table('SCOTT','test','test_p');
进一步熟悉该过程的机理可以通过查询:

SELECT sql_text FROM v$sqlarea WHERE sql_text LIKE'%TEST_P%';联机重定义表必须考虑的问题: 会占用源表两倍的空间.此外还要考虑物化视图 Log 的空间以及带来的其他开销.

(三)Shrink (10G新特性)
alter table TABLE_NAME enable row movement;
alter table TABLE_NAME shrink space;
优点: 不需要REBUILD INDEX ,不需要更大空间.没有对表LOCK;

DB2的高水位标记

表空间高水位:   创建一个DMS的表空间的最小大小是6个EXTENT。对于DMS表空间,可以从表空间中删除容器或缩小容器的大小。使用ALTER TABLESPACE语句来完成此操作。仅当该操作删除...
  • nayanminxing
  • nayanminxing
  • 2017年06月24日 14:38
  • 915

DB2 10.5 linux 数据库查询命令 及 表空间降低高水位(释放磁盘空间)

1.DB2查询基础命令 连接: db2 connect to [dbname] user [username] using [password] 列出当前实例中所有激活的数据库: db2 list...
  • Freedom_Long
  • Freedom_Long
  • 2017年09月25日 15:26
  • 1009

Oracle数据库降低HWM的几种方法

HWM是oracle中block有没有使用的分界线,它会随着数据的insert而上升,但它并不会随数据的delete而下降,因此全表扫描的时间并不因数据的delete而减少,相反可能由于块清除反而全表...
  • wh62592855
  • wh62592855
  • 2009年10月16日 23:38
  • 1601

ORACLE高水位线(HWM)和shrink table(表空间收缩)

一、ORACLE高水位线(HWM)   二、SHRINK TABLE
  • u013053796
  • u013053796
  • 2013年12月17日 20:44
  • 2570

Analyze table 如何降低表HWM

1 Anonlyze只影响user_tables的统计数据, 不影响user_segments占用空间等参数。 Analyze Table会分析BLOCKS,NUM_ROWS,AVG_RO...
  • thy822
  • thy822
  • 2011年06月27日 16:58
  • 562

分析HWM

下面结合官方文档和实验介绍下HWM: 以下英文摘自11gR2官方文档: HWM(high water mark):The boundary between used and unused spac...
  • BAT_os
  • BAT_os
  • 2015年04月16日 14:57
  • 886

MOVE降低高水位 HWM

MOVE降低高水位 HWM --创建实验表空间 SQL> create tablespace andy03 datafile '/home/oracle/app/oradata/orcl/...
  • zhang123456456
  • zhang123456456
  • 2017年04月02日 09:58
  • 286

Oracle中HWM与数据库性能的探讨

Oracle中HWM与数据库性能的探讨 一、什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segmen...
  • happyqwz
  • happyqwz
  • 2012年05月02日 21:55
  • 2110

ORACLE 降低 HWM 的集中方法

转自:http://www.eygle.com/archives/2011/11/oracle_hwm_tuning.html High Water Mark (HWM)指的是當我們建立...
  • StoneOK07
  • StoneOK07
  • 2010年09月06日 22:45
  • 377

【oracle调优】优化全表扫---降低高水位

Oracle高水位线的概念          Oracle里面的对象放到存储级别都称为segment(段),比如表段,索引段,回滚段等,这些知识segment的逻辑描述。下面就拿表段为例解释下。 ...
  • wang1016612067
  • wang1016612067
  • 2016年01月29日 15:56
  • 2070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何降低表的HWM
举报原因:
原因补充:

(最多只允许输入30个字)