众所周知,Oracle数据库表都是存储在表空间当中。从理论上来说,表可以放置在任何一个表空间当中。但是在实际工作中,处于性能、安全方面的考虑,数据库工程师往往不会这么随意。他们在建立数据库之前,会先对表空间进行规划,要为Oracle数据库选择一个合适归宿。由于这个没有技术方面的限制,故也没有统一的规则各寻。智者见智,仁者见仁。这更是考验数据库工程师水平的一个问题。
由于这没有统一的标准,公说公有理,婆说婆有理。为此笔者下面提的几个建议,或许也并不一定是真理。这些只是笔者工作经验的总结,各位读者可以有选择的参考。
规则一:不要把用户的表放置在System表空间。
当数据库安装完毕后,数据库据系统会默认创建三个表空间,分别为System、Sysaus、Temp的标空间。前面两个位系统表空间,后面一个为临时表空间。这两个表空间往往系统有特殊的用途。故通常情况下,在系统表空间中应该只存放包含数据字典和Oracle系统对象等等相关的表。如果数据库管理员在系统表空间中建立表(包括其他方案对象如视图等等)的话,将会影响数据库的性能。为此,无论是Oracle官方还是笔者都强烈建议,数据库管理员不要在系统表空间中建立其他的数据表等数据库对象。也就是说,除了系统安装时默认建立的对象之外,Oracle数据库工程师不要往这些系统表空间中放入任何数据库方案对象。默认情况下,数据库在权限方面没有进行这方面的控制,故主要靠用户自觉。为了防止将表建立在系统表空间中,笔者有如下几个建议。
一是参与数据库开发的用户如果有多个的话,最好给每个用户都设置一个默认的表空间(当然这个表空间不能够是系统表空间)。因为用户在建立数据库表的时候,默认情况下是保存在其设置的默认表空间上。故只要为用户设置默认表空间,则用户往往不会因为疏忽等原因而把数据库表误放入系统表空间了。
二是可以进行相关的权限控制。如在数据库开发时期,可以限制其他数据库用户往这系统表空间中存放数据库对象的权利。有时会为了防止意外,可以设置一个用户有这个往系统表空间中放东西的权利。如此其他用户需要往System等系统表间中建立数据库表或者其他数据库对象时,则只能够有一个用户来完成。这可以最大限度的限制系统表空间的干净。防止用户表放入到系统表空间,从而提高数据库的运行效率。
三是在数据库交付使用之前,数据库工程师最好再进行一次检查,看看系统表空间中是否有非系统表的数据表。在交付之前数据库工程师还可以做调整。如果交付后用户已经往系统中存储了数据才发现这个错误的话,那么调整起来工作量将会很大。
总之一个基本的原则就是系统表空间中不能够存放用户表等数据库对象,否则的话会降低数据库的性能。同时也不要将系统对象移动到其他的非系统表空间上。这个画蛇添足的做法也会降低数据库的性能。