深入解析:Row Movement 的原理和性能影响与关联

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ROW MOVEMENT特性最初是在8i时引入的,其目的是提高分区表的灵活性——允许更新Partition Key。这一特性默认是关闭,只是在使用到一些特殊功能时会要求打开。除了之前提到的更新Partition Key,还有2个要求打开的ROW MOVEMENT的功能就是flushback table和Shrink Segment。

ROW MOVEMENT特性最初是在8i时引入的,其目的是提高分区表的灵活性——允许更新Partition Key。这一特性默认是关闭,只是在使用到一些特殊功能时会要求打开。除了之前提到的更新Partition Key,还有2个要求打开的ROW MOVEMENT的功能就是flushback tableShrink Segment

所以,只有当使用到以上3个功能特性时,ROW MOVEMENT才会真正起作用。我们如果需要知道ROW MOVEMENT会对系统产生什么影响,就只要看这3个功能使用时会产生什么影响。

Flashback Table

先看Flashback Table。这一功能能帮助我们及时回滚一些误操作,防止数据意外丢失。在使用该功能之前,必须先打开ROW MOVEMENT,否则就会抛ORA-08189错误。我们看以下例子,可以说明在使用Flashback Table功能时,ROW MOVEMENT产生了什么作用:

be41298a1b5cb711db6d24974d2d3b9a27704c5f

此时,由于ROW MOVEMENT还未打开,命令出错。继续完成演示:

9617a13899645b75f4899af392f2483970620159

当开启ROW MOVEMENT后,表被顺利的flashback了,数据被找回。此时,再比较flashback前后记录的ROWID,大多数记录的物理位置都变化。这个过程的内部操作, 可以通过对Flashback Table做SQL Trace来进一步观察。

通过Trace,我们不难发现,Flashback Table实际是通过Flashback Query将表中数据进行了一次删除、插入操作,因此ROWID会发生变化

Shrink Segment

Shrink Segment能帮助我们压缩数据段、整理数据碎片、降低高水位,以提高性能、节省空间。它也同样要求开启ROW MOVEMENT。

48a46189d0152e851eceb4b041e51b6776418190

同样,我们可以看到在Shrink后,ROWID也变化了。从对其过程的Trace来看,Shrink对数据的改变不是通过SQL实现的,而是通过更底层的函数来实现的。

从以上分析来看,在执行上面2种操作操作后,其最大影响就是数据的ROWID会发生变化。因此,他们对我们系统的影响就仅限于那些依赖于ROWID编写的应用。

例如,一个程序需要对大量数据进行处理,为了提高效率和控制进度,代码会先将需要处理的数据记录的ROWID取出放入临时表中,然后再根据ROWID对数据进行分批进行处理。当ROWID被取出后,如果对表进行了上述操作,就可能会导致后依赖ROWID进行的操作发生错误。但是,这两种操作都属于维护性操作,第一种操作发生的机会非常少,从整体看,我们基本可以忽视这一操作对应用的影响;第二种操作也很少发生,并且可以在应用offline的时间进行操作,因此它的影响也是有限的。

更新Partition Key

在更新记录中的Partition Key时,可能会导致该记录超出当前所在分区的范围,需要将其转移到其他对应分区上,因此要求开启ROW MOVEMENT。

862c8fc8d36c4c9b4859b3fab48381bcbb6f86e1

这一操作产生影响的特殊之处在于这是个DML操作,是和online transaction密切相关。对于这样一个UPDATE,实际上分为3步:先从原有分区将数据删除;将原数据转移到新分区上;更新数据。

其影响就在于以下几个方面:

  • 一个UPDATE被分解为DELET、INSERT、UPDATE三个操作,增加了性能负担。其中,DELETE的查询条件与原UPDATE的查询条件相同,新的UPDATE的查询条件是基于INSERT生成的新的ROWID;
  • 相应的Redo Log、Undo Log会增加;
  • 如果Update语句还涉及到了Local Index的字段的话,新、旧2个分区上的Local Index都要被更新。

结论 

目前,ROW Movement真正会其作用(ROWID变化)只是在上述3种情况下,因此,需要分析其对系统会产生多大影响,就要分析上述三种操作在你的系统中出现的频率、以及是否有应用程序依赖与ROWID实现。

对于前面两种,之前说过,它们发生的概率并不高,我个人认为基本上可以忽略它们对系统的影响。而对于最后一种,需要从应用角度进行分析——Partition Key被更新的频率有多高?如果可能,最好实施一次等量负载下更细Partition Key的压力测试,通过对比分区和非分区下其产生的性能统计数据做比较,其带来的性能负载及Waits量与分区所获取的查询性能的提高相比,哪一种方式更有助于系统和应用的性能提高。

此外,有一点希望不要产生误解,开启ROW Movement并不会导致发生Row Migration时修改记录的Rowid。

还有一点,Row Movement会和域索引(Domain Index)产生冲突:如果表上定义了域索引,开启Row Movement就会失败;反之亦然。


原文发布时间为:2018-02-9

本文作者:黄玮

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

相关文章
|
14天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
43 1
|
18天前
|
存储 机器学习/深度学习 编解码
阿里云服务器计算型c8i实例解析:实例规格性能及使用场景和最新价格参考
计算型c8i实例作为阿里云服务器家族中的重要成员,以其卓越的计算性能、稳定的算力输出、强劲的I/O引擎以及芯片级的安全加固,广泛适用于机器学习推理、数据分析、批量计算、视频编码、游戏服务器前端、高性能科学和工程应用以及Web前端服务器等多种场景。本文将全面介绍阿里云服务器计算型c8i实例,从规格族特性、适用场景、详细规格指标、性能优势、实际应用案例,到最新的活动价格,以供大家参考。
|
23天前
|
SQL IDE 数据库连接
IntelliJ IDEA处理大文件SQL:性能优势解析
在数据库开发和管理工作中,执行大型SQL文件是一个常见的任务。传统的数据库管理工具如Navicat在处理大型SQL文件时可能会遇到性能瓶颈。而IntelliJ IDEA,作为一个强大的集成开发环境,提供了一些高级功能,使其在执行大文件SQL时表现出色。本文将探讨IntelliJ IDEA在处理大文件SQL时的性能优势,并与Navicat进行比较。
29 4
|
22天前
|
运维 持续交付 虚拟化
深入解析Docker容器化技术的核心原理
深入解析Docker容器化技术的核心原理
43 1
|
14天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
39 0
|
1月前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
47 1
|
18天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
46 0
|
24天前
|
API 持续交付 网络架构
深入解析微服务架构:原理、优势与实践
深入解析微服务架构:原理、优势与实践
22 0
|
25天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
25天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
33 0

推荐镜像

更多