返回顶部
首页 > 资讯 > 数据库 >Oracle 高水位线详解(HWM)
  • 729
分享到

Oracle 高水位线详解(HWM)

2024-04-02 19:04:59 729人浏览 薄情痞子
摘要

HWM:高水位线, 可用空间与已用空间的分界线,标记着段空间使用情况。 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的

HWM:高水位线,

可用空间与已用空间的分界线,标记着段空间使用情况。

所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。

Oracle 高水位线详解(HWM)

HWM首先位于新创表的表中第一个块。过了一段时间,随着表中插入数据的增多,而且使用的块越来越多,HWM会升高。

如果我们删除了表中的一些行,可能就会有很多块不在包含数据,但是他们仍在HWM之下,直到重建或截除(truncate)或收缩这个对象(shrink)。

oracle在扫描段时会扫描HWM之下的所有快,即使其中不包含数据,如果HWM之下大多数是空块,这会影响扫描的性能。

假如说,100000行的表,你执行select count(*) from tab;下面在delete from tab,将表中的所有行删掉,再次执行select count(*) from tab;结果显示只有0行,但执行该语句所花的时间和统计出100000行所用的时间一样多。

HWM数据库的操作有如下影响:

a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。

b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。 当使用直接路径机制加载的数据被删除后,有可能会浪费表中大量未使用空间。

跟踪检测高水位线标记下方的空间:

使用这个简单的测试,也可以检查高水位线下方是否有未使用空间。

1. set autot trace

2.  执行全表扫描的查询命令

3.  对比已处理的行号和I/O

如果已处理的行号很低,但I/O逻辑标号较高,高水位线标记下方的空间中就可能浪费了一些数据块。

使用 DBMS_SPACE软件包也检查高水位线标记下方的空间(自行查阅)

查看数据字典的分区视图:

查看DBA_extents视图也可以检查表的高水位线标记问题。

如果表拥有大量的区,但是没有数据,表明有大量的数据从表中删除:

Select count(*) from user_extents where segment_name=’INV’;

然后检查表中的行号:

Select count(*) from inv;

降低高水位线标记的方法:

1. Truncate

2. Alter table ...shrink space

3. Alter table ...move

1. 收缩表:

要调整高水位线,必须先为表开启行移动功能,

然后才能使用 alter table ...shrink space 语句。

表所在的表空间必须启用自动段空间管理功能。

查看是否为自动段管理模式:

Select tablespace_name,segment_space_management from dba_tablespaces

为表开启行移动功能:

Alter table inv enable row movement;

收缩该表使用的空间:

Alter table inv shrink space;

Alter table inv shrink space cascade;

通过cascade子句还可以收缩索引段使用的空间;

2. 移动表:

移动表是指在当前表空间中重建该表,或者在其他表空间中创建该表。

如果当前表空间出现了磁盘存储空间问题,或者需要降低表的高水位线,就需要移动表。

Alter table inv move tablespace users

查询user_tables视图可以进行验证;

Select table_name,tablespace_name from user_tables where table_name = ‘INV’;

在执行alter table ... move语句时,Oracle不允许执行DML语句。

在移动表时还可以设置nologging功能:

Alter table inv move tablespace users nologging;

通过nologging子句移动表,可以减少大量的重做日志

缺点: 如果在移动了表后失效时间立刻出现(因而没有备份),就无法恢复表的内容。

如果表中含有关键数据,在移动表时不应使用nologging子句。

移动表后,rowid发生变化,所有索引都会含有不正确的信息。

需要手动重建索引,alter index ... rebuild命令。

Rowid伪劣,不是存储在数据库中的。当你查询它时,Oracle才会计算出它的值。

3. 临时表

CREATE TABLE table_name_1 AS SELECT  *  FROM  table_name;

TRUNCATE TABLE table_name;

INSERT INTO table_name SELECT * FROM table_name_1;

或者删除源表,将CTS新建的表进行重命名。

4. 数据泵

将数据导出再导入。

校验方法:

通过分析比对表块删除数据前后占用变化.

SELECT num_rows ,blocks, empty_blocks  FROM dba_tables WHERE owner='SDBMGR' AND table_name ='TABLE_NAME';

测试:

如何知道一个表的HWM?

a) 首先对表进行分析:

ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;

b) SELECT blocks, empty_blocks, num_rows

FROM user_tables

WHERE table_name = <tablename>;

说明:

BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。

EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。

            

让我们以一个有28672行的BIG_EMP1表为例进行说明:

1) sql> SELECT segment_name, segment_type, blocks

FROM dba_segments

WHERE segment_name='BIG_EMP1';

SEGMENT_NAME       SEGMENT_TYPE    BLOCKS     

-----------------  --------------  --------- 

BIG_EMP1           TABLE           1024       

1 row selected.             

                

2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;

Statement processed.

           

3) SQL> SELECT table_name,num_rows,blocks,empty_blocks

FROM user_tables

WHERE table_name='BIG_EMP1';

TABLE_NAME  NUM_ROWS  BLOCKS     EMPTY_BLOCKS

----------  --------  -------    -------------

BIG_EMP1    28672     700        323

1 row selected.

注意:

BLOCKS + EMPTY_BLOCKS (700+323=1023)比DBA_SEGMENTS.BLOCKS少1个数据库块,这是因为有一个数据库块被保留用作segment header。DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS表示已经使用过的数据库块的数目。

             

4) SQL> SELECT COUNT (DISTINCT

DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||

DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"

FROM big_emp1;

Used

----------

700

1 row selected.

              

5) SQL> delete from big_emp1;

28672 rows processed.

          

6) SQL> commit;

Statement processed.

7) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;

Statement processed.

8) SQL> SELECT table_name,num_rows,blocks,empty_blocks

FROM user_tables

WHERE table_name='BIG_EMP1';

TABLE_NAME  NUM_ROWS   BLOCKS   EMPTY_BLOCKS

---------   --------   -------  ----------

BIG_EMP1    0          700      323

1 row selected.

9) SQL> SELECT COUNT (DISTINCT

DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||

DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"

FROM big_emp1;

Used

----------

0 ----这表名没有任何数据库块容纳数据,即表中无数据

1 row selected.

                        

10) SQL> TRUNCATE TABLE big_emp1;

Statement processed.

                   

11) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;

Statement processed.

                   

12) SQL> SELECT table_name,num_rows,blocks,empty_blocks

2> FROM user_tables

3> WHERE table_name='BIG_EMP1';

TABLE_NAME  NUM_ROWS  BLOCKS    EMPTY_BLOCKS

----------  --------  --------  ------------

BIG_EMP1    0         0         511

1 row selected.

                               

13) SQL> SELECT segment_name,segment_type,blocks

FROM dba_segments

WHERE segment_name='BIG_EMP1';

SEGMENT_NAME  SEGMENT_TYPE  BLOCKS

------------  ------------- ------

BIG_EMP1      TABLE         512

1 row selected.

注意:

TRUNCATE命令回收了由delete命令产生的空闲空间,注意该表分配的空间由原先的1024块降为512块。

为了保留由delete命令产生的空闲空间,可以使用TRUNCATE TABLE big_emp1 REUSE STORAGE.

用此命令后,该表还会是原先的1024块。

您可能感兴趣的文档:

--结束END--

本文标题: Oracle 高水位线详解(HWM)

本文链接: https://lsjlt.com/news/45304.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Oracle 高水位线详解(HWM)
    HWM:高水位线, 可用空间与已用空间的分界线,标记着段空间使用情况。 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的...
    99+
    2024-04-02
  • Oracle高水位High Water Mark(HWM)简介
      1.什么是高水位  高水位是Oracle中使用和未使用空间中的边界线,也可以理解为数据文间和非数据文间的分界线,但是这里的数据文件指代的是存储过数据的数据文件,而非仅仅是数据表中有数据的数据文件。  2...
    99+
    2024-04-02
  • 如何解析Oracle 高水位(HWM)对select性能的影响
    这篇文章将为大家详细讲解有关如何解析Oracle 高水位(HWM)对select性能的影响,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 不知道大家有没有...
    99+
    2024-04-02
  • ORACLE解决高水位线问题
    --方法一.ALTER  TABLE  table_name MOVE ;--对表重建ANALYZE  TABLE  table_name COMPUTE ...
    99+
    2024-04-02
  • oracle 回收高水位线
    select  round((1-a.used/b.num_total)*100,0)  percent from  (SELECT COUNT (DISTI...
    99+
    2024-04-02
  • Oracle 高水位
    Oracle 高水位(HWM: High Water Mark) 2017-04-14 02:49:28 SELECT a.owner, ...
    99+
    2024-04-02
  • Oracle 降低高水位线的方法
    Oracle  降低高水位线的方法  高水位(HIGH WARTER MARK,HWM)好比水库中储水的水位,用于描述数据库中段的扩展方式。高水位对全表扫描方式...
    99+
    2024-04-02
  • 降低高水位线
    1、建立初始化数据演示数据表中的高水位的变化 (1)、建立用户和表SYS@odb>create user test8 identified by test8;SYS@odb>grant...
    99+
    2024-04-02
  • ORACLE高水位表的查找方法
      高水位的介绍 数据库运行了一段时间,经过一些列的删除、插入、更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩; ...
    99+
    2024-04-02
  • Oracle—deallocate unused释放高水位空间(二)
    deallocate unused :仅适用于释放HWM高水位以上的空间,而无法释放高水位以下的空间;比如对表预分配的空间使用说明和方法,官方文档有说明,如下:Use the deallocate_unus...
    99+
    2024-04-02
  • Oracle move和shrink释放高水位空间 (一)
    move 和shrink 的共同点1、收缩段2、消除部分行迁移3、消除空间碎片4、使数据更紧密一、shrink语法:  alter table TABLE_NAME shrink space [c...
    99+
    2024-04-02
  • 分析Oracle表数据库高水位及shrink操作
    这篇文章主要介绍“分析Oracle表数据库高水位及shrink操作”,在日常操作中,相信很多人在分析Oracle表数据库高水位及shrink操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • Oracle数据库高水位释放——LOB字段空间释放
    在Oracle数据库中表随着数据增长,所占磁盘容量也会增长,当表中数据不再需要时,对表进行delete操作,表中代表所占空间的标志-高水位,不会随着数据删除而下降,高水位没有变化,即使删除了数据库,表所占...
    99+
    2024-04-02
  • Java线程的全方位详解
    目录什么是线程?线程的几种创建方式?线程的几种状态?线程相关的核心方法及作用?❤️‍大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!d...
    99+
    2024-04-02
  • jenkins流水线(jenkinsfile)详解,保姆式教程
    jenkins流水线(jenkinsfile)详解 在学习本篇文章的时候,可以去看看jenkins官网的文档,jenkins官网支持中文,观看十分便捷 此教程使用的是gitee+docker+j...
    99+
    2023-09-24
    jenkins docker 运维 java 容器
  • java的多线程高并发详解
    目录1.JMM数据原子操作2.来看volatile关键字3.并发编程三大特性4.双锁判断机制创建单例模式5.synchronized关键字6.AtomicIntger原子操作7.锁优...
    99+
    2024-04-02
  • java高并发之线程组详解
    目录线程组创建线程关联线程组为线程组指定父线程组根线程组批量停止线程总结线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树...
    99+
    2024-04-02
  • java开发CPU流水线与指令乱序执行详解
    目录引言1. Compiler Reordering2. CPU 流水线2.1. 从汽车装配谈起2.2. 现代CPU的流水线3. 超长流水线的瓶颈3.1. 性能瓶颈3.2. 功耗瓶颈...
    99+
    2024-04-02
  • 线上SpringCPU高负载解决思路详解
    目录引言定位问题日志搜索监控看板ThreadDump优化事后反思引言 背景: 在某一天,运营同事突然发现运营看板好几天没有更新数据了, 然后找了过来! 这里看似抛出了一个问题 但细...
    99+
    2024-04-02
  • java高并发的用户线程和守护线程详解
    目录程序只有守护线程时,系统会自动退出设置守护线程,需要在start()方法之前进行线程daemon的默认值总结守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作