当前位置: 首页 > news >正文

读书笔记:Oracle数据库的水位线秘密:为什么空表查询还很慢?

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

Oracle数据库的"水位线"秘密:为什么空表查询还很慢?

一、什么是数据库的"水位线"?

想象你有一个装水的浴缸,水位线标记了浴缸曾经达到的最高水位。Oracle数据库也有类似的标记,叫做"高水位线"(High Water Mark, HWM),它记录了表曾经使用过的最大空间位置。

举个生活中的例子:假设你有一个书架:

  • 刚开始是空的,HWM在第一格
  • 你买了100本书放进去,HWM就移到第100格
  • 后来你捐掉了所有书,但HWM仍然停留在第100格
  • 即使书架现在是空的,如果有人要检查整个书架,还是会从第1格看到第100格

二、水位线如何影响数据库性能?

这个机制会导致一个有趣的现象:一个完全空的表,执行全表扫描可能和它装满数据时一样慢!

真实案例:

  1. 我们创建一个有100万行数据的表
  2. SELECT COUNT(*) 需要5秒钟
  3. 删除表中所有数据
  4. 再次SELECT COUNT(*)——还是需要约5秒钟!

这是因为Oracle会忠实地检查水位线下的所有块,即使它们现在空空如也。

高效解决方案:使用TRUNCATE TABLE命令,它就像直接把书架重置回全新状态,水位线归零。

⚠️ 重要提醒:TRUNCATE是"不可撤销"操作,不会触发删除触发器,使用前请三思!

三、Oracle的"智能水位线"技术

在新式存储管理(ASSM)中,Oracle引入了"双水位线"机制:

  1. 高水位线(HWM):曾经达到的最高存储位置
  2. 低水位线(Low HWM):保证所有块都已格式化的分界线

这就像图书馆的两种标记:

  • 高标记:曾经放过书的最高书架
  • 低标记:保证所有书都整理好的位置

查询时:

  • 低水位线以下:直接读取(已整理好的区域)
  • 高低水位线之间:需要检查目录(位图)确认是否有内容

四、预防"数据搬家"的秘诀:PCTFREE

在Oracle中,每个数据块就像一个个小容器。PCTFREE参数决定了要为未来更新预留多少空间(默认10%)。

为什么这很重要?

想象你在整理行李箱:

  • 如果预留空间太少(PCTFREE设太低),后期想放入大件物品时,就得把东西搬到另一个箱子(行迁移)
  • 如果预留太多(PCTFREE设太高),箱子利用率就低了

行迁移的危害

  1. 查询需要多走一步(先到原位置,再跳转到新位置)
  2. 占用更多内存缓存
  3. 使表结构变得更复杂

设置建议

  • 经常更新的表:设置较高PCTFREE(如30%)
  • 只增不删的日志表:设置较低PCTFREE(如5%)

五、给数据库管理员的实用建议

  1. 定期维护:对大表使用ALTER TABLE...SHRINK SPACE整理空间
  2. 批量删除:清空表时优先考虑TRUNCATE而非DELETE
  3. 监控迁移:定期检查表的行迁移情况
  4. 合理规划:根据数据增长模式设置适当的PCTFREE

记住:理解这些存储机制,就像了解图书馆的书籍整理系统,能帮助你更好地管理数据库性能!

小知识:在自动管理的表空间中,Oracle会忽略PCTUSED参数,只关注PCTFREE设置。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

http://www.wxhsa.cn/company.asp?id=5660

相关文章:

  • AI测试平台自动遍历:低代码也能玩转全链路测试
  • 0代码5分钟一键生成Springboot+Vue后台管理系统
  • nvm与node.js的安装指南
  • 故障处理:2分钟处理Oracle RAC中OCR磁盘组丢失磁盘的故障
  • Saga分布式事务框架执行逻辑
  • 在Android开发中实现两个Intent跳转及数据交换的方法
  • ARC188 做题记
  • AT_arc145_d [ARC145D] Non Arithmetic Progression Set
  • Microsoft AI Genius | 第三集实战课正式开启:用 Copilot Studio 定制你的专属智能体
  • C# 多线程编程核心要点:不只是Thread和lock
  • 基于MATLAB的图像融合拼接GUI系统设计
  • Python使用多线程和异步调用
  • 研究生学术英语读写教程(中国科学院大学出版) Unit10 TextA 原文以及翻译(仅供学习)
  • 基于Python+Vue开发的蛋糕商城管理系统源码+运行步骤
  • 某运营商智慧协同平台——构建高效、敏捷的运营管理新模式
  • go使用反射获取http.Request参数到结构体 - 实践
  • 基于MATLAB/Simulink的TI2000系列DSP模型设计
  • 挖矿木马病毒清理手册
  • nginx 常用参数
  • Python常见函数和代码示例
  • Java开发电脑开荒软件
  • 69-SQLite应用 - 详解
  • mysql 源码下载,从获取到安装的完整指南
  • docker中centos7配置
  • centos7虚拟机下系统环境配置
  • CefSharp高版本问题
  • 前缀和pre,如何求总和:pre(r) - pre(l)(1 = l = r = n),以及|pre(r) - pre(l)|
  • P11537 [NOISG 2023 Finals] Toxic Gene 题解
  • keil5中stm32相关记录
  • centos7中mysql环境配置