MOVE降低高水位 HWM

--创建实验表空间
SQL> create tablespace andy03 datafile ‘/home/oracle/app/oradata/orcl/andy03.dbf‘  size 10M autoextend on next 30M; 
--创建实验数据
SQL> create table andy03 tablespace andy03  as select * from dba_objects ; 
SQL> insert into   andy03   select * from dba_objects ;
SQL> commit;
SQL> select BYTES/1024/1024,MAXBYTES/1024/1024 from Dba_Data_Files where tablespace_name =‘ANDY03‘; 
-- 模拟系列高水位变化
SQL>col name for a30
SQL> 
SELECT UPPER(F.TABLESPACE_NAME) " name",
D.TOT_GROOTTE_MB " size(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES " used(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),‘990.99‘) || ‘%‘ "percent",
F.TOTAL_BYTES "current_free_size(M)",
(SELECT free_space_mb+free_allocate_mb FROM dba_tablespace_free a where a.tablespace_name= f.tablespace_name) "total_ FREE_size",
D.TOT_GROOTTE_MB - F.MAX_BYTES "HWM(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
and f.tablespace_name=‘ANDY03‘
ORDER BY 3 desc;

name                             size(M)    used(M) percent  current_free_size(M) total_ FREE_size  HWM(M)
------------------------------ ---------- ---------- -------- -------------------- ---------------- ----------
ANDY03                                 40         22   55.00%                   18       32745.9844      22

SQL> create table andy04 tablespace andy03 as select * from dba_objects; 
SQL> 
SELECT UPPER(F.TABLESPACE_NAME) " name",
D.TOT_GROOTTE_MB " size(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES " used(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),‘990.99‘) || ‘%‘ "percent",
F.TOTAL_BYTES "current_free_size(M)",
(SELECT free_space_mb+free_allocate_mb FROM dba_tablespace_free a where a.tablespace_name= f.tablespace_name) "total_ FREE_size",
D.TOT_GROOTTE_MB - F.MAX_BYTES "HWM(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
and f.tablespace_name=‘ANDY03‘
ORDER BY 3 desc;
name                             size(M)    used(M) percent  current_free_size(M) total_ FREE_size  HWM(M)
------------------------------ ---------- ---------- -------- -------------------- ---------------- ----------
ANDY03                                 40         33   82.50%                    7       32734.9844      33

SQL> truncate table andy03;

SQL> 
SELECT UPPER(F.TABLESPACE_NAME) " name",
D.TOT_GROOTTE_MB " size(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES " used(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),‘990.99‘) || ‘%‘ "percent",
F.TOTAL_BYTES "current_free_size(M)",
(SELECT free_space_mb+free_allocate_mb FROM dba_tablespace_free a where a.tablespace_name= f.tablespace_name) "total_ FREE_size",
D.TOT_GROOTTE_MB - F.MAX_BYTES "HWM(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
and f.tablespace_name=‘ANDY03‘
ORDER BY 3 desc;

name                             size(M)    used(M) percent  current_free_size(M) total_ FREE_size  HWM(M)
------------------------------ ---------- ---------- -------- -------------------- ---------------- ----------
ANDY03                                 40      12.06   30.15%                27.94       32755.9244   19.06

-- 说明truncate table后,统计信息发生了变化,查询的 HWM 不是真实的(此时 HWM 值 = 表空间大小 - 表空间对象实际物理空间总和)。
SQL> alter database datafile 10 resize 20M;
alter database datafile 10 resize 20M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

-- 执行成功说明 真实的 HWM 为历史上实际最大值(33 M 为上面操作查询的值)。
SQL> alter database datafile 10 resize 33M;

Database altered.

-- 查询指定表空间内对象的块号
SQL> select  segment_name,block_id,blocks FROM dba_extents where Tablespace_name =‘ANDY03‘ order by block_id desc;
-- 查询表空间内所有对象
SQL> col SEGMENT_NAME for a25
SQL> 
SELECT t.owner, t.segment_name,SUM(bytes)/1024/1024 "SIZE(M)", t.SEGMENT_TYPE From dba_segments t
WHERE t.tablespace_name = ‘ANDY03‘
GROUP BY t.owner,t.segment_name,t.SEGMENT_TYPE
ORDER BY SUM(bytes) desc;

OWNER                          SEGMENT_NAME                 SIZE(M) SEGMENT_TYPE
------------------------------ ------------------------- ---------- ------------------
SYS                            ANDY04                            11 TABLE
SYS                            ANDY03                         .0625 TABLE

-- 一一开启所有对象 move 。 (按对象 block_id 由小到大 依次 move)

SQL> alter table andy04  move;

说明:
table在进行move操作时,我们只能对它进行select的操作。反过来说,当我们的一个session对table进行DML操作且没有commit时,  
在另一个session中是不能对这个table进行move操作的,否则oracle会返回这样的错误信息:ORA-00054  
  
SQL> 
SELECT UPPER(F.TABLESPACE_NAME) " name",
D.TOT_GROOTTE_MB " size(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES " used(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),‘990.99‘) || ‘%‘ "percent",
F.TOTAL_BYTES "current_free_size(M)",
(SELECT free_space_mb+free_allocate_mb FROM dba_tablespace_free a where a.tablespace_name= f.tablespace_name) "total_ FREE_size",
D.TOT_GROOTTE_MB - F.MAX_BYTES "HWM(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
and f.tablespace_name=‘ANDY03‘
ORDER BY 3 desc;

name                             size(M)    used(M) percent  current_free_size(M) total_ FREE_size  HWM(M)
------------------------------ ---------- ---------- -------- -------------------- ---------------- ----------
ANDY03                                 33      12.06   36.55%                20.94       32755.9244      13
-- move后,可resize 。 (原因 block_id 发生了变化)
SQL>  alter database datafile 10 resize 13M;

Database altered.

SQL> 
SELECT UPPER(F.TABLESPACE_NAME) " name",
D.TOT_GROOTTE_MB " size(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES " used(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),‘990.99‘) || ‘%‘ "percent",
F.TOTAL_BYTES "current_free_size(M)",
(SELECT free_space_mb+free_allocate_mb FROM dba_tablespace_free a where a.tablespace_name= f.tablespace_name) "total_ FREE_size",
D.TOT_GROOTTE_MB - F.MAX_BYTES "HWM(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
and f.tablespace_name=‘ANDY03‘
ORDER BY 3 desc;

name                             size(M)    used(M) percent  current_free_size(M) total_ FREE_size  HWM(M)
------------------------------ ---------- ---------- -------- -------------------- ---------------- ----------
ANDY03                                 13      12.06   92.77%                  .94       32755.9244   12.06

最后,HWM 的确下降了。 OK,转载请标明出处。

时间: 2024-11-18 00:36:39

MOVE降低高水位 HWM的相关文章

Oracle 高水位(HWM: High Water Mark)

一. 准备知识:ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. 每一个Block里可以包含多个row. 1.2 区: 由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表Dave时,首先ORACLE会分配一区的空间给这个表,随着不

Oracle 高水位(HWM)回收原理及操作方法

一.  高水位(HWM)及其产生原因 High Water Mark,HWM) 是Oracle(Segment)级别的概念.在仅有DML(比如delete,insert)操作时,高水位线只会增长,不会降低.具体来说,由于程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位. 下图为一个Segment内高水位不断增长的示意图: 注:一个表在初次插入记录时,Oracle会为其分配Segment和block. 插入大量数据后,高水位线随之增长 当数据

[Oracle]高水位标记(HWM)

(一)高水位标记(High Water Mark,HWM)的概念 所谓高水位标记,是指一个已经分配的段中,已经使用的空间与未使用的空间的分界线.在表的使用过程中,随着数据的不断增多(insert),HWM不断向数据段未使用部分方向移动,而在删除数据(delete)的过程中,HWM并不会向反方向移动,即使删除全部数据,HWM依然不会改变.但是如果使用了truncate命令,则表的HWM会被重置为0. 图1.segment (二)高水位标记的影响 全表扫描要读出直到HWM标记的所有的属于该表的数据块

Oracle高水位High Water Mark(HWM)简介

1.什么是高水位 高水位是Oracle中使用和未使用空间中的边界线,也可以理解为数据文间和非数据文间的分界线,但是这里的数据文件指代的是存储过数据的数据文件,而非仅仅是数据表中有数据的数据文件. 2.高水位对于检索的影响 假设我们有个表有2百万行数据存储在几个区中,假如我们删除一百万条数据.尽管数据区中的数据没有了,但是Oracle中占用的区的数据空间仍然不变,与原来二百万条数据占用的数据空间是一样的.当我们在数据库中执行查询时,Oracle仍会遍历所有的数据块,即便这些数据块中没有数据.从这个

用Delete与Truncate清除表数据对高水位的影响

众所周知,oracle段都有一个在段内容纳数据块的上限,我们把这个上限称为"High Water Mark"(HWM).这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment.原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值.HWM就像一个水库的历史最高水位,这也是为何会称之为"高水位"的缘故.实际环境中随着我们表中数据的不断增长,表的高水位也被不断的推高.当高水位达到一定程度之后,会对该表上的SQL查询效率产生负

Oracle 高水位说明和释放表空间,加快表的查询速度

高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表需要的存储空间:表以数据块的形式存储在数据文件中,表的存储结构是:行×行数,如果知道了总共有多少行,每行的平均长度,两者相乘,再除于90%的使用率,那么就可以知道实际需要存储的空间: 表的存储结构; 从统计信息得出平均每行的长度和总共的行数,从而知道存储的SIZE: 查找表实际存储的空间:数据实际存

Oracle 高水位问题

Oracle 对数据段的管理有一个高水位(HWM, High Water Mark)的概念.高水位是数据段中使用过和未使用过的数据块的分界线.高水位以下的数据块是曾使用过的,以上的是从未被使用或初始化过的. 当 Oracle 进行全表扫描(FTS, Full table scan)的操作时,它会读高水位下的所有数据块.如果高水位下还有很多空闲空间(碎片),读取这些空闲数据块会降低操作的性能. 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会

高水位回收

用两种方法可以进行表的高水位回收1.用shrink进行高水位回收(不需要重建索引,不需要额外空间)alter table bydvmi.tpo enable row movement;alter table bydvmi.tpo shrink space cascade;alter table bydvmi.tpo disable row movement;exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'BYDVMI',tabname=>'TPO',E

Oracle move和shrink释放高水位空间 (一)

move 和shrink 的共同点 1.收缩段 2.消除部分行迁移 3.消除空间碎片 4.使数据更紧密 一.shrink 语法: alter table TABLE_NAME shrink space [compact|cascate] segment shrink执行的两个阶段: 1.数据重组(compact): 通过一系列insert.delete操作,将数据尽量排列在段的前面.在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁. 由于涉及到rowid的改变,需要enable row