首页 > 代码库 > 合理使用表空间
合理使用表空间
在DB2数据库中,是按照表、表空间、数据库三个级别来存储数据的。由于表空间的设置直接跟数据库的性能相关。为此在表空间中数据表的部署是否合理就直接影响到数据库的运行效率。笔者认为,如果要让数据表合理的映射到表空间,至少需要遵守如下的规则。
规则一:根据表的访问率来映射表空间。
在一个数据库系统中,表的访问率是不同的。根据不完全的预测,一个数据库中大概只有40%到50%左右的表其具有比较高的访问率。而其他的数据表很难的才用到一回。如在一个为ERP而设计的数据库系统中,采购订单、销售订单等对应的数据表访问率是很高的,但是成本调整单等对应的数据表一年到头难得使用几次。所以在数据库部署中,数据库管理员首先要根据企业应用的实际情况,将数据库中的表按照其使用的频率进行分类。然后将使用频率高的表放在一个表空间,或者根据模块放在几个不同的表空间中。然后将他们存放在性能比较高的硬盘上,或者存放在活跃程度低的硬盘中。如此的话,I/O争用的现象就会少的多,从而提高数据库的性能。
规则二:根据字段的使用程度来规划表。
不仅不同的表访问频率有很大的差别,即使是同一个表中,其字段的访问频率也会有很大不同。如在一些人事管理系统数据库中,有些公司会将员工的身份证复印件或者照片扫描存放到数据库中。这些图片在数据库中需要利用LOB数据类型来存放。由于这个数据类型比较大,为此无论是在查询还是数据库备份的时候,都会给其带来负面的影响。如当用户在查询员工信息时,如果在SELECT语句中不加入字段的名称,而采用全部查询的方式,那么查询的速度会很慢。随着图片数量的增多,其速度会呈几何级别下降。但是实际上,用户平时并不需要访问这些员工的身份证复印件或者照片信息。所以在查询的时候,将这些没有的信息给他们显示出来,也是一种浪费,而且还影响数据库的性能。
为此在设计表的时候,如果某些列不经常用到,而且这些列的数据类型又是大数据类型或者说很多都是NULL值(数据库在处理NULL值的时候效率要比其他的只慢许多),此时最好将这些列跟其它的列分开在不同的表中存放。由于他们的访问频率不同,就可以按照上面第一个规则来映射表空间,以提高数据库的访问性能。
不过需要注意的是,如果身份证复印件等信息经常需要用到的,那么也最好将他们分开在两个表中。只是将存放复印件信息的表也存放在性能比较好的硬盘中,以提高访问这些数据的效率。之所以仍然需要将他们分开存放,这主要是考虑到备份的性能。因为这些LOB数据类型会降低数据库的备份效率,为此可以在数据库比较空闲的时候对这些LOB数据所在的表空间进行独立的备份。
规则三:索引数据、长字段数据、普通数据分开存放。
笔者在进行表空间设计的时候,往往会将索引数据、长字段数据与普通数据分开来存放。即将一个表空间用来存放索引数据,一个表空间用来存储长字段数据,另一个表空间庸才存储普通的数据。这主要是通过在建立表的时候为这些数据类型建立不同的表,然后将表根据数据类型分类的不同将他们存放在不同的表空间中。这主要是根据三种数据的作用不同而考虑的。众所周知,给表设置索引之后可以在很大程度上提高数据库的性能。这主要是因为如果设置索引好,数据库系统会先从索引找查找数据。查找相应的数据后会直接根据记录序列号从其他表中读取相关记录。也即是说只在索引表中查询,而不会在其他表中查找记录。所以说如果能够提高索引表的工作效率,那么就可以在很大程度上提高数据库的查询性能。为此笔者建议,将索引数据存放在单独的表空间中。如果硬件条件允许的话,并且企业对于查询具有比较高的性能要求,就将索引表空间存放在单独的硬盘中,以防止硬盘的I/O争用。如果硬件条件不允许的话,那么至少也要将这个索引表空间存放在性能比较高的硬盘上。
另外为了提高索引的工作效率,最好不讲在长字段上添加索引。如对于文本型的字段,虽然也可以为其添加索引。但是给其添加索引的话,工作效率并不会很高。此时将这个索引数据存放在单独的表空间中,这个表空间就会变得很大。根据笔者这么多年的工作经验,可以告诉大家,在长字段上设置索引,是得不偿失的。
将长字段分开来存放,还有一个原因就是节省存储空间。根据使用的经验,长字段的使用效率是比较低的。也就是说,在长字段数据类型中,一定会存在没有使用的空间。所以会有一定程度的浪费。具体的浪费数量要根据长字段的数据类型大小以及在列中出现的数据的大小是否相对一致。因为长字段数据会被系统尽可能的平均分配到页面中。而长字段数据的最后页面往往不能够占满其规定的字节,为此对于长字段来说,存储空间的浪费是不可避免的。故最好是将他们存放在不同的表中。这并不是说可以避免空间的浪费,而是指在有需要的时候可以更加方便的回收这些被浪费的空间。
规则四:根据备份的需要来规划表空间。
当数据库中的数据量比较多的时候,对数据库进行备份是一项比价花时间的工作。为此对于大型的数据库,管理员往往不会对整个数据库进行备份。而是在表空间的级别上,进行单独的备份。如此的话,就可以将数据库备份的时间分开来,从而可以有效减少对数据库正常作业产生的负面影响。
如以前有个客户,他们的业务非常的频繁,为此每天的数据都会有很大的增长。为了提高他们数据库性能,笔者决定采用在表空间级别上进行备份的策略。根据数据库繁忙程度的不同,分别在中午午休时间与晚上下班时间进行数据库的备份作业。这家企业数据库的空闲时间不读,只有中午一个小时与晚上二个小时的空闲时间。而根据预测,要完成海量数据库的备份,起码需要150分钟的时间。所以在空间时间内无法完成整个数据库的备份。为此笔者只好在表空间级别上进行备份,即将整个数据库的备份工作分散在这三个小时内完成。从而将数据库备份对服务器产生的性能影响降低到最低。
规则五:根据表的大小来规划表空间。
在整个数据库中,表的大小往往会有很大的差异。有些表可能只有不到几百条记录;而有些表则往往有上百万、上千万条记录。根据表记录数量的不同,可以将表分为大表与小表。在规划表空间的时候,这个就是需要考虑的一个因素。如可以将一些小表存放在一个单独的表空间中,并且是存放到SMS类型的表空间。因为对于小表来说,其I/O对于其性能的影响并不是很大。然后对那些大表,并且需要进行快速访问的,就需要选择合适的DMS表空间。这主要是因为对于大表操作,往往会涉及到很多的输入输出,此时这个I/O往往会成为其性能的瓶颈。
可见,要将表映射到合适的表空间不是一件很容易的事情。这不仅要求数据库管理员具有很深厚的技术功底,更重要的是要求他们有比较丰富的实际项目经验。有时候这个项目经验可能比固定的规则更加有用。所以希望数据库管理在牢记上面这些规则的同时,要学会灵活应用。而不能够在平时的工作中死搬硬套。如对于一些比较小型的应用,以上这些规则根据其不到应有的效果。相反,在这表空间设计上反而浪费了很多时间。故一般在比较大型的数据库应用中才需要通过表空间规划来提升数据库性能。
合理使用表空间