读书笔记: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)

posted @ 2025-09-16 15:09  认真就输  阅读(17)  评论(0)    收藏  举报