众所周知,表在Oracle数据库中占有很重要的地位,另外,碎片对于Oracle数据库空间管理有很大的阻碍作用。同时如果段中的盘区量比较多的话,也会影响到数据库的性能。虽然说在 Oracle10G中采用了本地托管表空间技术,已经可以在最大程度上消除由此带来的负面影响。但是当数据量一大,盘区量增加,仍然会降低数据库的查询效率。当数据库管理员遇到类似的情况时,该如何处理呢?在这篇文章中,笔者主要针对这个问题做出一些说明,以供大家参考。
一、如何统计某个表所使用的盘区数量?
Oracle数据库系统在分配磁盘空间的时候,往往采用的是逐笔分配的方法。如此长久以往,随着表逐渐变大,其使用的盘区数量也会随之增加。如果在部署数据库的时候,不能够合理的预见到表的增长情况,那么后续盘区数量就会非理性的增长。从而最终影响到数据库性能。为此数据库管理员必须要对数据库的运行不间断的进行追踪,如需要统计一些常用表、记录数量比较多的表的盘区数量。
如下图所示,这是一个ERP系统中产品信息基本表的盘区情况。据笔者了解,这家公司数据库才用来不满六个月。此时产品表的盘区数量已经达到了 25。如果再过个半年,那么盘区数量就有可能突破100了。很明显,在数据库设计的时候,数据库管理员没有预料到这种情况。如果任其发展下去,其很可能会成为系统性能的瓶颈。故有必要对其进行整理。
二、创建新表空间并将相关数据移植进去。
当数据库管理员发现表所占用的盘区数量非常大已经成了不争的事实时,需要设法对表进行整理。一般比较推荐的做法是创建一个新的表空间,然后将相关的数据再移植进去。在谈具体的操作之前,笔者要强调一点。虽然数据库允许这个事后的弥补措施,但是笔者并不建议经常这么操作。笔者的意见是在数据库设计的时候,就最好能够遇见到表日后的增长情况。如果某个表的记录比较多、更新比较频繁、使用也比较多的话,那么最好能够为其设置一个比较独立的表空间或者比较高的增长率。这些措施都可以在最大程度上降低日后表所占用的盘区数目,提高表的查询效率。
第一步:创建一个新的表空间并创建一个M_PRODUCT1表。
注意笔者并不建议在已有的表空间中建立表。这主要是因为已有的表空间中其可能已经没有连续的存储空间了。为此不能够确保新创建的表格一定具有连续的磁盘空间。笔者认为,最好能够再重新创建一个新的表空间。而且由于这张表更新频率比较快、使用频率也比较高,为此专门设置一个表空间有利于后续的维护,如数据的升级、备份等等。另外需要注意的是,要为这个表空间设置一个合适的大小。一般来说,最好这个大小能够满足未来两年的需要。这可以满足未来数据增长的需要。否则的话,如果每隔半年或者一年就遇到盘区数量过多的问题,那显然会很头疼。
表空间创建完成之后,再建立一张M_PRODUCT1表。在创建这个表的时候,数据库管理员可以采用Create as Select * FROM M_PRODUCT的形式来创建表。在创建表的同时,将数据也导入到新表中,从而确保数据与数据类型的一致。
第二步:删除原表与表中的索引。
主要要先将原表中的索引一一删除,然后才能够删除表。否则的话,系统会提示错误信息。为了保障数据的安全,笔者强调一次,在操作之前最好先对整个数据库进行一次完全备份。其次由于这会影响到系统的正常运行,为此在操作之前最好先断开当前的所有用户。并设置为用户不能够访问。以免在操作的过程中,造成不必要的麻烦。一般建议在用户不使用数据库的时候,如下班后或者双休日对其进行操作。
第三步:重命名新表并建立索引。
将原先的表删除之后,再将刚才新建的表格名字改成原来的表名。然后根据原先的表建立相关的索引。这里比较简便的方法是,在创建新表的时候就将索引也复制过去。不过索引的名字不能够重复,为此需要在原有的索引名字后面加入一个后缀。等到旧表删除之后,再将索引的名字改回来,并重新启用。注意,如果表中的数据比较多的话,则这个重新创建索引的时间可能会比较长。
最后笔者提醒一点,如果客户表增长过快,可以将数据移植到一个有着更大的统一盘区大小的表空间里,以适应后续表的增长。当然这是一项比较大的工程。虽然这需要重建相关表的索引,但是这能够保证这个表不会从数据库物理存储中丢失。如果数据库管理员觉得有这么操作的必要,则笔者可以提供一些加快操作的建议。如可以使用COPY命令来避免使用回滚段。或者说使用Nologging选项来避免重做导致的时间问题。当记录比较多时,使用NOLOGGING 选贤能够加速数据插入的速度。不过其也同时带来一个缺陷,即当出现问题时不能够进行回滚操作。鱼与熊掌不能够兼得,最后数据库管理员还是要在性能与安全之间进行均衡。
通过以上这种方式来解决盘区过多的问题,只能是不得已而为之的事情。最关键的还是要在数据库设计阶段,就对表的增长进行合理的预计。然后根据预计的结果对盘区空间以及表空间进行合理的规划。合理的规划可以将盘区数量控制在比较小的范围之内。
关于Oracle数据库中表占用盘区的讲解就为大家介绍这么多,希望大家通过上文的学习之后都能够从上文中涉及到的内容中有所收获。