为Oracle数据库表选择一个合适的归宿

为Oracle数据库表选择一个合适的归宿

发布: admin | 类别: 数据库相关 | 点击:4043 | 更新时间:2012-07-20 09:58:27

0 条评论

 众所周知,Oracle数据库表都是存储在表空间当中。从理论上来说,表可以放置在任何一个表空间当中。但是在实际工作中,处于性能、安全方面的考虑,数据库工程师往往不会这么随意。他们在建立数据库之前,会先对表空间进行规划,要为Oracle数据库选择一个合适归宿。由于这个没有技术方面的限制,故也没有统一的规则各寻。智者见智,仁者见仁。这更是考验数据库工程师水平的一个问题。 
  由于这没有统一的标准,公说公有理,婆说婆有理。为此笔者下面提的几个建议,或许也并不一定是真理。这些只是笔者工作经验的总结,各位读者可以有选择的参考。
  规则一:不要把用户的表放置在System表空间。
  当数据库安装完毕后,数据库据系统会默认创建三个表空间,分别为System、Sysaus、Temp的标空间。前面两个位系统表空间,后面一个为临时表空间。这两个表空间往往系统有特殊的用途。故通常情况下,在系统表空间中应该只存放包含数据字典和Oracle系统对象等等相关的表。如果数据库管理员在系统表空间中建立表(包括其他方案对象如视图等等)的话,将会影响数据库的性能。为此,无论是Oracle官方还是笔者都强烈建议,数据库管理员不要在系统表空间中建立其他的数据表等数据库对象。也就是说,除了系统安装时默认建立的对象之外,Oracle数据库工程师不要往这些系统表空间中放入任何数据库方案对象。默认情况下,数据库在权限方面没有进行这方面的控制,故主要靠用户自觉。为了防止将表建立在系统表空间中,笔者有如下几个建议。
  一是参与数据库开发的用户如果有多个的话,最好给每个用户都设置一个默认的表空间(当然这个表空间不能够是系统表空间)。因为用户在建立数据库表的时候,默认情况下是保存在其设置的默认表空间上。故只要为用户设置默认表空间,则用户往往不会因为疏忽等原因而把数据库表误放入系统表空间了。
  二是可以进行相关的权限控制。如在数据库开发时期,可以限制其他数据库用户往这系统表空间中存放数据库对象的权利。有时会为了防止意外,可以设置一个用户有这个往系统表空间中放东西的权利。如此其他用户需要往System等系统表间中建立数据库表或者其他数据库对象时,则只能够有一个用户来完成。这可以最大限度的限制系统表空间的干净。防止用户表放入到系统表空间,从而提高数据库的运行效率。
  三是在数据库交付使用之前,数据库工程师最好再进行一次检查,看看系统表空间中是否有非系统表的数据表。在交付之前数据库工程师还可以做调整。如果交付后用户已经往系统中存储了数据才发现这个错误的话,那么调整起来工作量将会很大。
  总之一个基本的原则就是系统表空间中不能够存放用户表等数据库对象,否则的话会降低数据库的性能。同时也不要将系统对象移动到其他的非系统表空间上。这个画蛇添足的做法也会降低数据库的性能。
  规则二:为用户数据表适当的分家。
  Oracle数据库系统可以创建多个非系统表空间。但是,并不是把用户表分散在多个表空间中就能够取得比较好的效果。如果把表随意的分散到不同的表空间中,则当执行某些数据库管理和维护操作时就需要花费更多的时间,并且无法集中管理属于某个应用的数据。
  那么有人就会说,把所有的表都存放在一个表空间中就好了呀。这是一个笨办法,往往也不是最好的选择。因为把表有选择的分散保存在多个表空间中,只要合理就能够提高数据库的性能。如当把用户表分门别类的放置到不同的表空间中,就可以将某个表空间设置为只读状态,从而可以将数据库的一部分设置为只读状态。如可以通过表空间的大小来灵活的为用户设置存储限额。如可以把不同的表空间存放在不同的硬盘上,从而降低硬盘的输入输出竞争,提高数据库的性能。
可见,用户数据表到底要不要分家,分不同的表空间存放,这是一个难以抉择的问题。笔者认为,应该对数据表进行合理的分家,以提高数据库的性能以及灵活性。当然分家也不能够分的太小,否则的话反而会增加数据库系统的负担。具体来说,在给数据表进行分家时,可以参考以下几个建议。 
  一是根据应用的不同来创建不同的表空间。有时会数据库管理员可能会在同一个数据库中部署不同的应用。此时把不同的应用部署在不同的表空间中,是一个不错的选择。如此的话,就可以保证各个不同应用之间数据的独立性,防止相互之间产生干扰。
  二是如果某些数据表出于一些特殊的需要,要设置为只读,则可以把这些特殊的数据表存放在一个特定的表空间中。然后数据库工程师只要把这个特定的表空间设置为只读,则存放在这个表空间中的表都将设置为只读,不允许用户进行删除、更新、插入等操作。这个权限设置将覆盖在表权限上的设置,故相对来说更加的安全。
  三是数据库据工程师在开发数据库的时候要考虑用户是否有磁盘限额控制的要求。有些企业的数据库应用可能做的比较大,各个分公司的数据都存放在同一个数据库中。为此,有必要对用户的磁盘限额进行设置。否则的话,某个分公司或者部门如果占用了比较多的磁盘空间,将会对其他用户产生不利影响。故如果要对用户实现磁盘限额的话,那么最好能够把不同用户的表放置在不同的表空间。然后针对表空间来实现磁盘限额。因为在Oracle数据库中没有针对用户来进行磁盘限额的功能。故只好通过这个曲线救国的方案来实现。
  四是从数据库的用途来考虑是否要要把用户的表进行分家,放置在不同的表空间。如数据库的访问者比较多,并发行访问比较频繁的话,那么如果把用户表放置在一个表空间中,会对硬盘的输入输出产生比较大的压力。也就是说,硬盘的输入输出跟不上CPU、内存的频率,从而硬盘的访问速度将成为影响数据库性能的瓶颈。要提高数据库服务器硬盘的存储效率,有三种方式。一是采用性能比较好的硬盘(如转速高或者串口硬盘)。不过这个由于受到硬件条件的限制,改善的效果并不是很明显。二是可以考虑把不用用户的表放置在不同的表空间,然后把不同的表空间放置在不同的硬盘上,以提高数据存取的效率。三是可以通过磁盘阵列技术来改善数据库数据的存取效率。因为采取了磁盘阵列技术之后,系统会把大的数据库分成一个个小的数据块。在保存的时候会同时存入到几块硬盘中;在读取的时候也可以同时从硬盘中读出来。从而提高硬盘的输入输出效率。所以笔者建议对于并发性访问比较高的数据库,可以考虑对用户的表按部门或者其他规则进行分家,放置在不同的表空间以及硬盘中。如果这个分家规则不知道怎么定义或者并发性访问没有明显规律的话,那么可以通过磁盘阵列来改善因为并发性访问导致的数据库据性能下降问题。
  总之,对于用户数据表是否要分家这个问题,笔者的意见是要谨慎。设计数据库系统时,数据库工程师要预先规划存放应用系统表的表空间。即使要对数据表进行分家的话,也不能够随意将用户表分散到不同的表空间中去。要根据表的性质、种类、用户需求等角度去考虑,同时兼顾数据库的安全性、数据库性能等等。以上四个建议是笔者对用户表进行分家时主要参考的规则,大家可以拿来进行参考。
  最后需要强调的是,如果光从数据库性能方面出发,只要数据库服务器实现了磁盘阵列技术,那么如果再对数据库表进行分家效果就不怎么明显了。也就是说,磁盘阵列与数据库用户数据表分表空间存放两个手段,往往只需要采用一个即可。换句话说,就是1+1 <2的意思。
关键字 :数据库相关 Oracle

0 条评论

 

欢迎留下您的评论

红框选项必须输入,不允许html代码。

联系我们

  • 电话: 18908191278 028-61408608
  • 网址: www.drawnet.cn
  • QQ: 464410235
  • 微信: 464410235
  • 邮箱: master@drawnet.cn

关于我们

关注微信公众号

扫码关注微信服务号

进入微信小程序

扫码进入微信小程序