Oracle 高水位线和低-高水位线(High Water Mark Low High Water Mark)

ops/2024/11/13 16:17:23/

在Oracle的逻辑存储结构中(表空间-段-区-块),数据是存在数据段中的,通常一个表就是一个数据段,而段最终又由许多数据块组成。当数据存入数据块时,需要对块进行格式化,高水位线(High Water Mark, HWM)是段中的一个点,在这个点之上的所有数据块都是未格式化且未使用的。

文章目录

  • 一、高水位线和低-高水位线的概念
  • 二、高水位线的影响
  • 三、降低表的高水位线

一、高水位线和低-高水位线的概念

在默认的自动段空间管理(ASSM)模式下,Oracle使用位图来管理段内的空间分配。HWM的从表开始创建开始,变化过程如下:

1.新建一张表(数据段)时,段内所有的数据块都是未格式化(格子代表数据块)且未使用的,此时的HWM位于段的开头:
在这里插入图片描述

2.当insert语句向表中插入数据时,Oracle会分配一部分数据块,并向右移动HWM。HWM以下的数据块代表已分配,但分配的块可能用不完,而且只有当数据真正写入某个块时(蓝色格子),才会对块进行格式化,因此引入低-高水位线(Low High Water Mark, LHWM)来表示所有已经格式化的块。
在这里插入图片描述
3.随着表内的数据不断更新和删除,数据段的状态可能变成这样:

  • LHWM之下所有数据块都是已格式化的,可能包含数据,也可能不包含数据
  • LHWM和HWM之前的数据块都是已分配,可能格式化,也可能未格式化
  • HWM之上的数据块都是未分配且未格式化的
    在这里插入图片描述

二、高水位线的影响

LHWM和HWM主要影响全表扫描的效率,当SQL查询需要进行全表扫描时,Oracle会进行如下操作:

  1. 获取LHWM的位置,读取LHWM之下的所有块,因为它们已格式化,代表使用过。
  2. 然后读取位于LHWM和HWM之间的已格式化块,避开未格式化的块。

所以全表扫描会扫描HWM下的所有已格式化的块。但从上面的图上可以看出,随着数据的更新,删除,HWM之下很多块可能已经没有数据了(碎片空间),但是依然会扫描该块。

一个极端的例子是使用delete删除表中所有记录时,HWM并不会下降,因此全表扫描的实际开销没有任何减少。这就是为什么使用delete删除一张大表后,你会发现即使表是空的或仅有很少数据,用select * from table;语句查询依然要花很长时间。

另外,当用直接路径插入(Direct-Path Insert)插入数据时(用APPEND提示或通过SQL*Loader直接路径),数据会直接从HWM之上开始写入,HWM下面的未使用的空间就浪费掉了。这个操作也会产生大量的碎片空间。

三、降低表的高水位线

当表经过长时间使用/直接路径插入/大量数据删除这些操作后,HWM之下很可能会有大量的碎片空间,在遇到全表扫描的操作时,性能低下,为了让数据更“紧凑”,需要降低表的HWM。

降低高水位线的方法有:

  • 重建(rebuild),用expdp/impdb导出、导入来完成表的重建。
  • 替换(replace),将表的数据复制到一张同结构中间表,drop源表,然后将中间表重命名为源表。
  • 截断(truncate),清空表中数据时使用truncate代替delete。
  • 移动(move),使用alter table tbl_name move;语句移动数据行,要重建索引。
  • 收缩(shrink),使用alter table enable row movement; 和 alter table tbl_name shrink space语句收- 缩表,相比移动可以保持索引有效,但会产生大量undo和redo日志。

http://www.ppmy.cn/ops/133351.html

相关文章

GPT o1 模型使用及API调用

智匠MindCraft最新加入的o1-preview和o1-mini模型。本文将详细介绍这两款模型的技术参数、应用场景及价格对比。 1. o1-preview模型 最大输入:128K tokens最大输出:32K tokens输入价格:107元/百万tokens输出价格:426元/百万tokens…

高并发系统设计之架构分层

文章目录 什么是分层架构分层有什么好处如何来做系统分层分层架构的不足 什么是分层架构 软件架构分层在软件工程中是一种常见的设计方式,它是将整体系统拆分成 N 个层次,每个层次有独立的职责,多个层次协同提供完整的功能。“MVC”&#xf…

ffmpeg内存模型

文章目录 展示图拷贝packet 重要!!!avpacket.c相关函数av_packet_alloc 简单的赋值 里面的还有没有进行初始化的指针av_packet_ref 展示图 拷贝packet 拷贝packet有两种情况 1: 两个packet的buf引用的是同一个数据缓冲空间&#…

WebPages 安全

WebPages 安全 1. 引言 随着互联网的普及和信息技术的发展,Web页面已经成为人们获取信息、进行交流和开展业务的重要平台。然而,随之而来的安全问题也日益突出,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF&a…

switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?

在Java中,Switch语句是一种多分支选择结构,用于根据变量的值选择执行不同的代码块Switch语句可以作用于以下几种数据类型: 1.byte,short,char,int:这些都是基本数据类型,switch语句可以直接作用于它们 2.枚举类型(enum):从Java5开始,switch语句可以作用于枚举类型。 3.字…

深度学习知识点3-CBAM轻量的注意力模块

论文:(2018)包含空间注意力和通道注意力两部分1807.06521https://arxiv.org/pdf/1807.06521 通道注意力:对input feature maps每个feature map做全局平均池化和全局最大池化,得到两个1d向量,再经过conv&…

如何让3dsMax渲染效果更逼真好看?

一、选择合适的渲染器 Arnold: 强大且适应性强,能够满足多种场景和需求,提供高品质的全局照明和精确的物理材质。 V-Ray: 渲染速度快,功能全面,擅长复杂光照和材质处理,配备高效的降噪工具。 Corona Renderer: 用户…

IDEA接入OpenAI API 方法教程

在 IntelliJ IDEA 中接入 ChatGPT API,你需要以下几个步骤: 步骤 1: 获取 OpenAI API 密钥 访问 OpenAI 官方网站,注册并登录到你的账户。进入你的账户设置页面,获取 API 密钥。将 API 密钥保存在一个安全的地方,因为…