读书笔记:关于Oracle分区表:当数据想"搬家"时会发生什么?

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

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

关于Oracle分区表:当数据想"搬家"时会发生什么?

想象一下,你有一个按照年份分区的表格,比如2020年的数据放在A区,2021年的数据放在B区。现在你想把一条2020年的数据修改成2021年,这时候会发生什么?

两种修改情况

情况1:数据还在原分区

  • 比如把2020年12月31日改成2020年12月30日
  • 数据仍然属于2020年分区,修改很顺利

情况2:数据需要跨分区移动

  • 比如把2020年12月31日改成2021年1月1日
  • 这时候数据需要从2020年分区“搬家”到2021年分区

数据“搬家”的注意事项

1. 需要开启“搬家权限”

  • 默认情况下,Oracle不允许数据随意跨分区移动
  • 需要执行:ALTER TABLE 表名 ENABLE ROW MOVEMENT

2. 数据的“身份证”会变

  • 每条数据都有唯一的ROWID(相当于身份证号)
  • 跨分区移动后,ROWID会改变
  • 就像人搬家后身份证地址会变更一样

3. 内部操作其实很复杂

  • 表面上看是一次简单的更新
  • 实际上背后是“删除旧数据+插入新数据”的组合操作
  • 会更新所有相关的索引,工作量比普通更新大很多

实际应用建议

什么时候可以用?

  • 偶尔需要调整分区键的值
  • 比如数据录入错误需要修正

什么时候要谨慎?

  • 如果经常需要让数据跨分区移动
  • 这可能意味着你的分区设计不合理
  • 频繁的数据“搬家”会影响性能

举个实际例子

假设有个按年份分区的销售表:

  • 2020年数据在part_1分区
  • 2021年数据在part_2分区

如果把2020年12月31日的销售记录改成2021年1月1日:

  1. 先开启行移动权限
  2. 执行更新操作
  3. 数据会从part_1分区移动到part_2分区
  4. 该数据的ROWID会发生变化

总结: 数据分区是个好功能,但设计时要考虑周全。尽量避免频繁修改分区键,如果确实需要,要了解背后的代价并做好性能监控。

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-10-30 16:59  认真就输  阅读(6)  评论(0)    收藏  举报