机构一同事向我反馈,说他们的一个客户,星空系统上线不到1年,数据表空间就消耗了190G,客户感觉他们的系统没那么大的数据量,不应该用掉这么大的磁盘空间,同事让我给他们做下检查,看能不能找出一些端倪。
我猜测,应该是遇上了数据对象的高水位问题。
1 什么是高水位,简单的说,它是个标识,标识出某个对象(比如:表)里的数据,在磁盘的最后位置,也就是,当遇上这个标识时,数据到此为止,标识后面没有数据了。这样,当数据库做全表(全索引等)扫描,遇上此标识时,就完工了,不再扫描。
2 换句话说,做全表扫描时,数据库必须读到此标识,才能停止工作;显然,高水位标识的位置,决定着数据库做全表扫描时的工作量,高水位标识距离数据段的初始位置越远,往往意味着表的数据量越大。
3 若数据段里都是数据,那全表扫描就得读取完这些数据,这无可厚非;但有时候,数据段里并非全是数据,而是空闲空间,这就会让全表扫描做无用功:IO执行完成后,才发现没有数据,IO白做了。
4 因此,降低高水位标识,是减少全表扫描时,做无用功的关键。这样,问题来了:
4.1 怎么知道表存在高水位的问题?
4.2 发现表存在高水位问题时,如何操作,才能降低其高水位标识?
4.3 这些操作,是否存在风险?操作过程中,要注意哪些事项?
这些问题,请看附件,
5 后续检查这个客户的数据表空间的情况,情况确实如我猜想,某个表,USER_SEGMENTS数据字典显示,它占用了26G的磁盘空间,但计算其总记录数,和每行的平均长度(字节)之积,才不到1.5G,即便给它加上50%的管理空间,也不到(1.5G*1.5=2.25G)2.5G,这说明,该表存在的严重的高水位问题,大概还有这些空闲空间:26-2.25=23.75G,没存放数据,若能降低其高水位,估计能节省23G,,,后面还有好几个表存在类似的情况,估计都整了,能省下50G的磁盘空间。
对附件有疑问的,请找我咨询,
ORACLE表高水位的判断及处理方法_20220804.zi …(7.53KB)
推荐阅读