我们的文章会在微信公众号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格
二、水位线如何影响数据库性能?
这个机制会导致一个有趣的现象:一个完全空的表,执行全表扫描可能和它装满数据时一样慢!
真实案例:
- 我们创建一个有100万行数据的表
SELECT COUNT(*)
需要5秒钟- 删除表中所有数据
- 再次
SELECT COUNT(*)
——还是需要约5秒钟!
这是因为Oracle会忠实地检查水位线下的所有块,即使它们现在空空如也。
高效解决方案:使用TRUNCATE TABLE
命令,它就像直接把书架重置回全新状态,水位线归零。
⚠️ 重要提醒:TRUNCATE是"不可撤销"操作,不会触发删除触发器,使用前请三思!
三、Oracle的"智能水位线"技术
在新式存储管理(ASSM)中,Oracle引入了"双水位线"机制:
- 高水位线(HWM):曾经达到的最高存储位置
- 低水位线(Low HWM):保证所有块都已格式化的分界线
这就像图书馆的两种标记:
- 高标记:曾经放过书的最高书架
- 低标记:保证所有书都整理好的位置
查询时:
- 低水位线以下:直接读取(已整理好的区域)
- 高低水位线之间:需要检查目录(位图)确认是否有内容
四、预防"数据搬家"的秘诀:PCTFREE
在Oracle中,每个数据块就像一个个小容器。PCTFREE参数决定了要为未来更新预留多少空间(默认10%)。
为什么这很重要?
想象你在整理行李箱:
- 如果预留空间太少(PCTFREE设太低),后期想放入大件物品时,就得把东西搬到另一个箱子(行迁移)
- 如果预留太多(PCTFREE设太高),箱子利用率就低了
行迁移的危害:
- 查询需要多走一步(先到原位置,再跳转到新位置)
- 占用更多内存缓存
- 使表结构变得更复杂
设置建议:
- 经常更新的表:设置较高PCTFREE(如30%)
- 只增不删的日志表:设置较低PCTFREE(如5%)
五、给数据库管理员的实用建议
- 定期维护:对大表使用
ALTER TABLE...SHRINK SPACE
整理空间 - 批量删除:清空表时优先考虑TRUNCATE而非DELETE
- 监控迁移:定期检查表的行迁移情况
- 合理规划:根据数据增长模式设置适当的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)