百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

当领导要你计算一个表的HWM时应该怎么计算

sinye56 2024-09-29 22:00 4 浏览 0 评论

概述

深入理解HWM对于做数据库优化是必须掌握的一个基础,很多时候我们以为删了数据后表应该会快很多,但是得到的结果却很不理想,这其中就涉及到HWM方面了,也是truncate和delete不同的地方。


一、什么是水线 (High Water Mark)?

所有的 oracle 段(segments,在此,为了理解方便,建议把 segment 作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或 HWM。这个 HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个 segment。

HWM 通常增长的幅度为一次5个数据块,原则上 HWM 只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值。

HWM 很象一个水库的历史最高水位,这也就是 HWM 的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了 truncate 命令,则该表的 HWM 会被重新置为0。

HWM本身的信息是储存在段头.在段空间是手工管理方式时,ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配.在段空间是自动管理方式时(ASSM),ORACLE是通过BITMAP来管理段内的空间分配.


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

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

据。

2、即使 HWM 以下有空闲的数据库块,键入在插入数据时使用了 append 关键字,则在插入时使用 HWM 以上的数据块,此时 HWM 会自动增大。


三、如何计算一个表的 HWM ?

1、首先对表进行分析:

ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;

2、计算HWM

SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name = <tablename>;

说明:

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

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

3、实例

1)查看表段

create table test_hwm2 as select * from dba_objects;

SELECT segment_name, segment_type, blocks FROM dba_segments WHERE segment_name='TEST_HWM2';

2) 分析表

ANALYZE TABLE TEST_HWM2 ESTIMATE STATISTICS;

3)计算HWM

SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name='TEST_HWM2';

总的块数是1275,没有使用的块是3,也就是TEST_HWM2的HWM为1275-3+1=1273

注意:

这里DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS 表示已经使用过的数据库块的数目。


四、Oracle 表段中的高水位线 HWM

在 Oracle 数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark,HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说 HWM 为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用 delete 语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。

下面我们来谈一下 Oracle 中 Select 语句的特性。Select 语句会对表中的数据进行一次扫

描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle 就扫描

这么大的数据块,而是 Oracle 会扫描高水位线以下的数据块。

如果是一张刚刚建立的空表,你进行了一次 Select 操作,那么由于高水位线 HWM 在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用 delete 语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于 delete 语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用 select 语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。


之前小编也写了个存储过程是专门来计算HWM的,大家也可以通过那个方法来计算,降低HWM可以使用rebuild、truncate、shrink、move等操作,后面会介绍下怎么通过move去降低HWM,感兴趣的朋友可以关注下!!

相关推荐

RHEL8和CentOS8怎么重启网络

本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...

Linux 内、外网双网卡路由配置

1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...

Linux——centos7修改网卡名

修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...

CentOS7下修改网卡名称为ethX的操作方法

?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...

Linux 网卡名称enss33修改为eth0

一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...

CentOS下双网卡绑定,实现带宽飞速

方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...

linux 双网卡双网段设置路由转发

背景网络情况linux双网卡:网卡A(ens3)和网卡B(...

Linux-VMware设置网卡保持激活

Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...

VMware虚拟机三种网络模式

01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...

Rocky Linux 9/CentOS Stream 9修改网卡配置/自动修改主机名(实操)

推荐...

2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题

问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...

Linux网卡的Vlan配置,你可能不了解的玩法

如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...

Centos7 网卡绑定

1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...

Linux搭建nginx+keepalived 高可用(主备+双主模式)

一:keepalived简介反向代理及负载均衡参考:...

Linux下Route 路由指令使用详解

linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...

取消回复欢迎 发表评论: