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