【转】浅谈改进数据库应用系统性能的常用策略
注本文版权由文章原作者所有,如果作者认为本转载侵犯了原作者的权利,请与管理员联系 admin@ig2net.info
浅谈改进数据库应用系统性能的常用策略
陆兆洁 南宁经济信息中心
摘要:本文主要简述了改进数据库应用系统性能的常用策略,并从系统层次架构角度分别介绍了在不同领域所采用的方法,本文的侧重点放在解决问题的方法论上,期待能够达到抛砖引玉之效。
1 引言
数据交互复杂度与频度的提升,导致了数据库在运维、迁移和规模扩展进程中的性能问题。作为一项确保企业IT基础部件健康运营的关键技术,数据库性能优化的实现路径和IT系统管理架构越来越密不可分。
在数据库成熟应用的时代,数据库的性能优化已经演变为一项相当严密的系统工程。作为企业IT基础设施的核心部件之一,数据库并不是孤立的系统,它与网络、操作系统、存储等硬件系统紧密相连,这种与其他IT部件的多重连接特性决定了数据库性能优化是一门综合技术。
2 数据库应用系统性能的优化
完整的数据库性能优化周期可以分为两个阶段,一是设计与开发阶段,主要负责对数据库逻辑和物理结构的优化设计,使其在满足具体业务需求的前提下,系统性能达到最佳,同时系统开销最小;二是数据库的运行阶段,其优化手段以数据库级、操作系统级、网络级为主。
2.1 数据库的设计和开发阶段
数据库性能下降很大一部分的风险是能够在数据库的设计阶段予以规避的。因此,设计优化也就成为了数据库性能优化技术的源头和方向。由于数据库逻辑结构的不合理、索引设计不合理,开发阶段的技术冲突无法调适,多种因素的累积作用导致了许多数据库系统上线后不久即出现性能故障的案例不在少数。比较生命周期的调优成本与调优收益曲线,性能调优的成本随软件生命周期进程而增加,但调优收益却随软件生命周期进程而减少。在该阶段的具体实现上一般表现为某一类数据库,其性能的改进主要体现在逻辑设计和物理设计上。
2.1.1 数据库的逻辑设计
数据库的逻辑结构是由一些数据库对象组成,如数据库表空间、表、索引、段、视图、存储过程、触发器等。数据库的逻辑存储结构(表空间等)决定了数据库的物理空间是如何被使用的,数据库对象如表、索引等分布在各个表空间中。
数据库的逻辑配置对数据库性能有很大的影响,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包括将系统数据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。
数据库逻辑设计的结果应当符合下面的准则摘要:
(1)把以同样方式使用的段类型存储在一起;
(2)按照标准使用来设计系统;
(3)存在用于例外的分离区域;
(4)最小化表空间冲突;
(5)将数据字典分离。
逻辑结构优化用通俗的话来说就是通过增加、减少或调整逻辑结构来提高应用的效率,可以从以下几个方面来精练数据库的逻辑设计:
1、基本表扩展
数据库性能包括存储空间需求量的大小和查询响应时间的长短两个方面。为了优化数据库性能,需要对数据库中的表进行规范化。一般来说,逻辑数据库设计满足第三范式的表结构轻易维护且基本满足实际应用的要求。所以,实际应用中一般都按照第三范式的标准进行规范化,从而保证了数据库的一致性和完整性,设计人员往往会设计过多的表间关联,以尽可能地降低数据冗余。但在实际应用中这种做法有时不利于系统运行性能的优化:如过程从多表获取数据时引发大量的连接操作,在需要部分数据时要扫描整个表等,这都消耗了磁盘的I/O和CPU时间。
为解决这一问题,在设计表时应同时考虑对某些表进行反规范化,方法有以下几种:一是分割表。分割表可分为水平分割表和垂直分割表两种:水平分割是按照行将一个表分割为多个表,这可以提高每个表的查询速度,但查询、更新时要选择不同的表,统计时要汇总多个表,因此应用程序会更复杂。垂直分割是对于一个列很多的表,若某些列的访问频率远远高于其它列,就可以将主键和这些列作为一个表,将主键和其它列作为另外一个表。通过减少列的宽度,增加了每个数据页的行数,一次I/O就可以扫描更多的行,从而提高了访问每一个表的速度。但是由于造成了多表连接,所以应该在同时查询或更新不同分割表中的列的情况比较少的情况下使用。二是保留冗余列。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。三是增加派生列。派生列是由表中的其它多个列的计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。
因此,在数据库的设计中,数据应当按两种类别进行组织:频繁访问的数据和频繁修改的数据。对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化。对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。有时还需将规范化的表作为逻辑数据库设计的基础,然后再根据整个应用系统的需要,物理地非规范化数据。规范与反规范都是建立在实际的操作基础之上的约束,脱离了实际两者都没有意义。只有把两者合理地结合在一起,才能相互补充,发挥各自的优点。
2、索引的建立
创建索引是提高检索效率最有效的方法之一,索引把表中的逻辑值映射到安全的RowID,能快速定位数据的物理地址,可以大大加快数据库的查询速度,一个建有合理索引的数据库应用系统可能比一个没有建立索引的数据库应用系统效率高几十倍,但并不是索引越多越好,在那些经常需要修改的数据列上建立索引,将导致索引B*树的不断重组,造成系统性能的下降和存储空间的浪费。对于一个大型表建立的索引,有时并不能改善数据查询速度,反而会影响整个数据库的性能。这主要是和SGA的数据治理方式有关,Oracle在进行数据块高速缓存治理时,索引数据比普通数据具有更高的驻留权限,在进行空间竞争时,Oracle会先移出普通数据,对建有索引的大型表进行数据查询时,索引数据可能会用完所有的数据块缓存空间,Oracle不得不频繁地进行磁盘读写来获取数据,所以,在对一个大型表进行分区之后,可以根据相应的分区建立分区索引。
2.1.2 数据库的物理设计
数据库物理设计需要对时间效率、空间效率、维护代价和各种用户要求进行权衡,结果会产生多种方案,必须对此进行细致评价,选择一个较优的方案作为数据库的物理结构。
数据库的数据最终是存储在物理磁盘上的,对数据进行访问就是对这些物理磁盘进行读写,因此对于这些物理存储的优化是系统优化的一个重要部分。对于物理存储结构优化,主要是合理地分配逻辑结构的物理存储地址,这样虽不能减少对物理存储的读写次数,但却可以使这些读写尽量并行,减少磁盘读写竞争,从而提高效率,也可以通过对物理存储进行精密的计算减少不必要的物理存储结构扩充,从而提高系统利用率。
为了避免数据库文件之间的竞争,在物理设计时,文件应该被放到不同的I/O通道,跨越驱动器的文件分离,避免磁盘争用成为一个“瓶颈”。主要应该注意以下几点技巧:把关键数据文件分布在各个可用的磁盘上,这些文件包括表空间、回滚段或UNDO段、联机重做日志文件、操作系统盘、经常访问的表的数据文件以及经常访问的索引的数据文件;把数据和索引文件分开放置;对于经常连接的表,把它们的数据和索引表空间分开,这样每个表上的信息就不会放在相同的磁盘上;把控制文件的多个备份存储到不同的磁盘和控制器上,以最终实现操作并行化。
同时,还应将表数据和索引数据分开表空间存储,分别使用独立的表空间。因为假如将表数据和索引数据放在一起,表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数据和索引数据存放在不同的表空间中,并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。
2.2 数据库的运行阶段
数据库的运行管理主要通过对数据库运行环境进行调整来达到改进性能的目的。在决定进行系统性能调优级时,首先应制定一个完善的调优级方案,先监控系统并分析问题所在,然后根据分析结果每次调整一个参数,再进一步监控系统查看系统性能有无变化,然后做进一步调节。其中有一个重要的原则:每次最好只调节一个参数。
2.2.1 数据库级参数性能调优
一般来说,数据库管理系统(DBMS)中与性能相关的参数都与对系统物理内存的设置有关,换言之,数据库级参数性能优化即是DBMS对系统内存的配置。通常,只要将这些主要参数设置好就会显著改善数据库系统的性能,因此,配置好数据库系统参数,是优化数据库系统运行环境的关键。
数据库管理系统对系统内存的配置应尽可能实现如下目标:
一是减少分页:当系统执行分页时,会将当前没有使用的信息从内存移到硬盘上。这样就可以为当前需要内存的程序分配内存。如果频繁地发生分页,系统性能就会严重降低,从而导致很多程序的执行时间变长。
二是减少内存交换:当系统执行内存交换时,会将活动进程临时地从内存移到硬盘上,这样另一个活动进程就可以得到所需要的内存。内存交换基于系统循环时间。如果内存交换过于频繁,就会产生大量的磁盘I/O,应用的性能可能会急剧恶化。
三是扩大高速数据存储内存缓冲区容量:用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据,以实现加速的目的。主要包括数据块缓冲、数据字典缓冲、恢复回滚日志缓冲以及SQL共享池等这几个部分摘要。对这些内存缓冲区的合理设置,可以大大加快数据查询速度,提高内存区的命中率。
2.2.2 操作系统级参数性能调优
(1)进行定期的磁盘检查和磁盘空间清理,当系统运行一段时间后,会出现一定的文件错误和磁盘碎片,此时就需要进行磁盘整理。
(2)自动关闭停止响应的程序,无须进行手工干预。
(3)调整应用程序优先级,让常用程序拥有较高的优先权,自然运行速度就会快些。
(4)配置操作系统核心使用更少的内存。
(5)配置操作系统与DBMS相关的内核参数以便将更多的系统内存留给DBMS使用。
2.2.3 网络级参数性能调优
网络带宽会影响系统性能,减少网络负载,可以改善系统的性能。
负载均衡将是大型应用高负荷访问和大量并发请求采用的终极解决办法,它提供了一种有效的方法来扩充服务器带宽,增加吞吐量,提高网络的灵活性和可用性。
对负载均衡的应用,可以从网络的不同层次入手,具体情况要看瓶颈所在,不外乎从传输链路聚合、采用更高层网络交换技术和设置服务器集群策略三个角度实现,一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建集群,这样的架构成本低、性能高还有很强的扩张性,随时往架构里面增减节点都非常容易。
3 结束语
在应用丛生、高度分布式的环境中,要总结出一套“放之四海皆准”的数据库性能优化方法论并不容易。但结合企业自身特色的性能优化流程却是有据可循的。同时,数据库性能优化方法还具有浓重的行业色彩。
在对数据库应用系统改进所采取的策略中,前面提到的每个方法可能都会被用到,本文介绍得比较粗浅,具体实现过程中很多细节还需要慢慢熟悉和体会,有时一个很小的参数设置,对于系统性能的影响就会很大,在此仅概而述之,以期达到抛砖引玉之效