对比oracle和PG对收缩表的空间占用对索引的影响

290 阅读2分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

对比oracle和PG对收缩表的空间占用对索引的影响

随着数据量的不断积累,对于oracle来说,表有一个水位线的概念,正常业务的增删改,应用执行delete语句不会回收使用过的空间,数据虽然删除了,高水位线却不会降低,这样会导致oracle的高水位会逐渐升高;而对于PG数据库,它也不会主动的缩小表的尺寸。这种大量update/delete操作后数据文件中保留下来过期元组导致数据文件过大的情况称之为表膨胀。
那oracle来回收空间的方法可以通过move表。

SQL> alter table t_fshe move ;

PG回收空间的方法主要是通过VACUUM操作。

postgres=# vacuum FULL t_fshe ;

在oracle数据库中,当对表执行move后,表上的索引会失效。这时候就需要通过重建索引来恢复。

alter index index_name rebuild online;

而PG数据库执行VACUUM操作,会自动维护表上的索引。所以不会出现索引失效的情况。
PG的VACUUM分为两种形式,一种是普通的VACUUM,一种是VACUUM FULL。
当一个表中有过期的数据-我们称之为死元组dead tuple-我们如果执行VACUUM进行回收,那这个表文件中的dead tuple所在的数据块就可以重新被新数据使用,但是不会缩小表文件的大小,也就是占用的系统空间不会变小;而使用VACUUM FULL,它会重新生成一组表文件,并且将dead tuple占用的空间进行回收,这样操作完成后数据文件就会变小,相应的占用的系统空间也会变小,就会释放一部分文件系统空间。

下边提供一个oracle数据库下查询所有需要rebuild的索引信息并生成相关语句的方法:

select 'alter index '||index_name||' rebuild online;' from  user_indexes where status <> 'VALID' and index_name not like'%$$';