在公路建设中通过建立多条车道可以提高道路的流量其实这个道理在Oracle数据库中也行得通即可以将关键数据文件存储在多块硬盘上以提高Oracle数据库的性能可惜的是不少数据库管理员没有意识到这一点在这篇文章中笔者就以OracleG为例说明如何通过在硬盘之间分布关键数据文件来提高性能
一在硬盘之间分布关键数据文件的基本原则
在传统的文件系统上(即不是在裸机上)部署Oracle数据库可以通过将关键的数据文件分布到多个可用的文件系统上或者不同的硬盘上来提高数据库的性能具体的来说需要遵循如下几个原则
一是对于表来说往往包含两个部分即基本表与索引表只要为基本表中的字段创建了索引其对应的就有一张索引表当用户访问表中的数据时应用系统需要同时访问到索引表与数据表此时我们可以将这两张表比喻成两辆车如果现在只有一个车道(即将他们同时存放在一个硬盘或者文件系统中)那么两辆车必须前后行使而如果现在有两个车道(即将基本表与其相对应的索引表存放在不同的硬盘或者文件系统中)那么这两辆车就可以并排行使显然后者的效率更高为此笔者建议可将经常需要访问的表和与之对应的索引表分开来存放
二是可以将日志文件也分开来存放不光光是数据表与索引表存在着这种状况其实在日志文件管理中也是如此只要条件允许那么最好能够将联机重做日志和归档日志与其它数据文件存放在不同的硬盘或者文件系统上因为当用户往数据库中写入数据时需要同时往数据文件与重做日志文件中写入数据此时如果将它们分开来存放那么就相当于有了多条车道分别往不同的文件中写入数据这无疑就可以提高数据写入的效率从而提高数据库的性能
二哪些文件最好能够分开存放?
在讲到硬盘之间分布关键数据文件的基本原则的时候笔者举了几个需要分开存放的几个案例但是在实际工作中并不仅仅局限于上面提到的这些文件笔者认为如果条件允许的话那么可以考虑将如下文件放置在不同的硬盘上
一是表空间如临时表空间系统表空间UNDO表空间等等这三个表空间可能系统会同时进行访问为此需要将其分开来存放二是数据文件和索引文件上面提到过需要将经常访问的数据文件与其对应的索引文件存放在不同的硬盘上因为这两类文件在访问数据时也可能会同时访问到三是操作系统盘与数据库文件单独存放显然Oracle系统肯定是与操作系统同时运行的为了避免他们之间的I/Q沖突就需要将Oracle部署在操作系统盘以外的磁盘上四是联机重做日志文件这个文件比较复杂不但要将其与其他文件分开来存放而且还需要注意的是最好能够将其存放在性能最佳的硬盘上
最后需要说明的一点是增加磁盘也会增加成本这不光光是购买磁盘所需要的花费还包括管理的成本所以这之间也会涉及到成本与性能之间的一个均衡问题如果企业的数据不是很多或者主要是涉及到查询操作那么这么设计的话就可能不怎么合理因为投入要大于回报
三如何确定是否需要将文件分开来存放?
在实际工作中企业的数据是一个从少到多的过程也就是说刚开始使用数据库的时候可能数据量比较少此时出于成本的考虑没有将相关文件存放在不同的磁盘上但是随着工作的深入用户会发现数据库的性能在逐渐的降低此时管理员就需要考虑能够采取这种多建车道的措施来提高数据库性能当然在采取这个措施之前管理员需要先进性评估此时评估所需要用到的一个指标就是磁盘的I/O争用
磁盘争用通常发生在有多个进程试图同时访问一个物理磁盘的情况下如现在用户需要访问某个数据表中的数据此时系统需要访问索引文件与数据表文件如果将它们放置在同一磁盘上那么在访问时就会发生I/O沖突所以评估I/O沖突的严重程度可以帮我们来确定是否需要将关键文件存放在不同的磁盘上
将I/O平均的分布到多个可用的磁盘上这可以有效的减少磁盘之间的争用情况提高数据存储与读取的性能从而提高Oracle等应用程序的效率在实际工作中数据库控制文件中有两个参数可以用来帮助我们评估这个指标这两个参数是文件平均读取时间和文件平均写入时间不过在使用这两个参数的时候其只评估所有与数据库相关联的文件管理员如果有需要的话也可以通过下面的查询语句来查询数据文件是否存在I/O问题查询的语法与结果如下图所示
从如上的查询结果中可以看出某个数据文件是否繁忙数据文件之间是否存在着/I/O沖突文件这里需要注意的是这个结果是一个动态的结果在不同的时刻用户进行不同的操作时往往会得出不同的结论为此笔者建议在使用这个数据的时候最好能够多跟蹤几次然后分析多次运行的结果只有如此才能够得到比较合乎情理的判断
通常情况下管理员根据上面的结果可以得出三种结论
第一种结论是上面这些数据文件都不是很忙即文件的平均读取时间与写入时间都比较短表示这两个文件都是比较空闲的此时正常情况下数据库的性能应该是不错的也就是说如果此时数据库的性能不理想的话那么就不是磁盘的I/O所造成的管理员应该从其他角度来改善数据库的性能
第二种结论是每个数据库文件都非常的繁忙此时有可能是读取时间或者写入时间比较长或者说两个时间都比较长当多个数据文件同时比较繁忙并且他们处于同一磁盘的话那么管理员就需要考虑购买新的磁盘然后将上面提到的这些关键文件重新整理让他们部署在不同的磁盘上
第三种结论是某几个特定的数据文件比较繁忙而其他数据文件还可以此时管理员如果成本受到限制那么也不需要重新购买硬盘在磁盘上的物理写入和读取次数上如果出现比较大的差异就表明某个磁盘负载过大即有很严重的I/O沖突此时最好能够将这个磁盘中的文件进行调整如将某些文件移动到另外的一块I/O相对不怎么严重的磁盘上不过在采取这个操作的时候需要注意一点对于联机重做日志文件来说即使其所在的磁盘I/O沖突比较低或者访问这个文件的时间比较短但是也不建议将其他数据文件转移到其所在的磁盘上来因为通常情况下为了保障数据库的性能我们都建议将联机重做日志文件单独存放并且还需要讲起放置在性能比较高的硬盘上
总之将关键的Oracle数据库文件分开放置如此的话可以有效避免磁盘争用成为Oracle数据库系统的性能瓶颈