一.为什么ASE数据库要定期做碎片清理
由于Sybase是通过OAM页、分配单元和扩展页来管理数据的,所以对OLTP应用的Database Server会十分频繁地进行数据删除、插入和更新等操作,时间一长就会出现以下几种情况:
1.因行转移产生的碎片
即本来可以存放在一个页上的数据行却分散地存储在多个页上。如果这些页存储在不同的扩展单元上,Database Server就要访问多个扩展单元,因此降低了系统性能。
例子:
1).数据行Data1最开始存储在页Page1上
2).执行数据更新操作,因Page1空间不足,Data1转移到Page2上,同时Page1保留指向Page2的数据引用
官方文档记载,上述情况发生行转移时,总是会通过两次页访问,才能到达一个转移的行,但是如果再做一次行转移,如下:
3).再次做数据更新,同样原因导致Data1再次转移到Page3上
这个时候,是将Page1的行引用直接指向Page3呢,还是会在Page2上增加一个引用,即:Page1指向Page2,Page2再指向Page3呢?
这个作为课题,将会在后续的月报中再进一步证明.但是至少要通过两次页访问,如果这种数据行大量存在的话,执行效率可想而知.
2.因删除和更新操作产生的碎片
对表做删除操作或将行长度缩短的更新操作时,会出现空闲空间,目的是为了防止事务回滚。随着空闲空间的累积,扩展单元的利用率也会下降,从而影响整体性能。
实际上,数据在存储空间上排列得越紧密有序,Database Server访问的速度就越快,消除碎片有助于提高系统的性能和更有效地利用数据存储空间。
二.碎片清理方法
ASE中清理碎片的方法有很多,重建表,BCP,REORG等,本文主要讲解REORG的几种常用方式.
1.执行REORG命令的限制
a.只能系统管理员或者对象的owner来执行此命令
b.只能对DOL表执行此命令
c.不能在事务中执行此命令
2.REORG常用语法
语法1:
REORG RECLAIM_SPACE TABLE_NAME [INDEX_NAME][WITH {RESUME | TIME = NO_OF_MINUTES}]
例:
REORG RECLAIM_SPACE T_MS_AJ --回收表中的页垃圾
REORG RECLAIM_SPACE T_MS_AJ I_MS_AJ_AH --回收索引中的页垃圾,只能用在一个索引上
●该命令可以运行在正在使用的表或索引上,但会引起锁争用
语法2:
REORG FORWARDED_ROWS TABLE_NAME [WITH {RESUME | TIME = NO_OF_MINUTES}]
例:
REORG FORWARDED_ROWS T_MS_AJ
●对于有漂移行的页
如果垃圾可回收,漂移行就会返回
如果垃圾不可回收,则该行会被删除,并重新插入到其他地方
由于索引上没有漂移行,所以不能运行在索引上
●对于因逻辑删除而产生的垃圾,也可被回收
●该命令可以运行在正在使用的表上,但会引起锁争用
语法3:
REORG COMPACT TABLE_NAME [WITH {RESUME | TIME = NO_OF_MINUTES}]
例:
REORG COMPACT T_MS_AJ
●在表上运行,与RECLAIM_SPACE,FORWARDED_ROWS效果相同
由于它只扫描页一次,所以有更好的性能
由于索引上没有漂移行,所以不能运行在索引上
●对于因逻辑删除而产生的垃圾,也可被回收
●该命令可以运行在正在使用的表上,但会引起锁争用
语法4:
REORG REBUILD TABLE_NAME
例:
REORG REBUILD T_MS_AJ
●重建整个表
●删除所有索引,并重新创建这些索引
因此,它可以提高索引聚簇
●需要与表和它的索引同样大小的额外空间
●在表重建过程中,需要将整个表,上表级排他锁
●为了能使用此命令,必须将数据库选项SELECT INTO/BULKCOPY/PLLSORT设置为TRUE
值得注意的是,上面只有第四种方法,没有resume,time选项.
resume:会接着上一次reorg的地方继续reorg
time:本次reorg的执行时间
三.碎片清理的建议周期
在OLTP应用系统中,如果更新删除操作比较频繁,又不想影响应用的正常访问的话,
建议:
一周做一次reorg compact(因为它组合了reorg reclaim_space 和 reorg forwarded_rows 的功能),又不会锁表,应用系统可以正常访问.
一个月做一次reorg rebuild,彻底对表以及索引进行重建.但是这个操作会锁表,影响应用系统的正常访问,所以建议放到每个月最后一个周末来做这个操作.