陈 华
[摘要]数据库系统作为现在商业应用中极为广泛的一种应用,其建立和使用过程中是否将有限的资源最优的利用,关系到用户的满意程度和企业的成本控制。数据库调优可以使数据库应用运行得更快,有更高得吞吐量和更短的响应时间。介绍数据库优化的原理,接着讨论几种数据库调优的方法。
[关键词]数据库性能优化
中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0610080-01
一、数据库调优的基本原则
(一)如何分配服务器端与客户端的合理需求。数据库系统的数据非常密集,要从这样的系统中获得令人满意的性能,不仅仅要对系统的数据库管理部分进行调优,考虑如何在数据库系统(服务器)和应用程序(客户端)之间分配工作也是非常重要的。
首先是考虑客户与服务器的相关计算资源是否充足。特别是在很多情况下,服务器都会过载,而其他部分都正常的工作,这时候部分的任务就应该迁移到客户端去。其次是相关信息的获取,当数据库发生变化的时候系统应该有些响应。那么在应用程序中进行的轮询就应该由内部的触发器代替。因为轮询的办法会定期地查看表是不是有变化,而触发器仅仅在发生变化时被激发,因此开销就要小得多。而数据库任务和其他任务是不是交互也很重要,如果存在交互,那么访问屏幕的那部分应该放在事务之外执行,原因是屏幕交互会占用大量时间。如果某个事务持有时间片,那么它会阻止其他事务访问它所持有的数据。
(二)减少启动次数获取性能优化。数据库所耗费的大量资源是用来启动的。比如,在磁盘上开始一个读操作是很耗时的,但是一旦开始,磁盘就能告诉地传输数据。每当某个重要的查询从包含成千上万列的表中只查取少数几列时,垂直划分是个很好的策略。再比如,对查询,即使是简单查询而言,解析、进行语义分析、选择存取路径的系统成本也是惊人的,一般都超过10000条指令,这就要求应该事先编译经常执行的查询。总之,要用尽可能少的启动次数来获取最好的性能。
(三)解决系统瓶颈问题。大多数情况下,系统运行缓慢不是由于所有部件都饱和引起的,而是由于系统中的某个部分限制了整体的性能,这些部分称为瓶颈。解决的策略首先局部调整(例如采用增加索引或者重写查询的方法,以便更好地利用现有索引),应该首先考虑。第二个策略是进行划分。数据库系统中的划分将负载分散到更多的资源上执行,或者在时间上并行分配,从而减少某个部件上的负载量。在很多情况下划分的确能解决瓶颈问题。事实上,划分是在加速瓶颈所在部件无效的情况下才进行的。
二、数据库的分类调优
(一)事务处理过程的调优。事务是数据库应用程序便于处理的事件部分。一般来说,开发者将事务处理方式看做原子的没一个事务都会本隔离的执行没有任何并发动作。但遗憾的是,应用程序中的事物序列本质上是一个整体,上面提到的原子性保证是不存在的。和设计操作系统时常常遇到的问题一样,在一个应用程序执行的两个事务之间,可能会有另外一个应用程序的事务执行,而且后者很可能修改可前者两个事务需要访问的数据项。从这里可以看出,事务短一点会更容易避免这样的情况。那么是不是就把事物切分成尽量小的粒度以提高执行效率呢?从上面来看是的,但遗憾的是,这样做会破坏执行的正确性。这种性能和正确性之间的矛盾充斥着和并发控制有关的调优过程。在这种情况下,在考虑事务的性能的时候有几点调优选项如下:
1、事务使用的锁的个数和性能成反比;2、读锁是对性能最有利的锁:3、事务持有锁的时间越短,性能越好。
(二)索引调优泛谈。索引是建立在表上的一种数据组织,它能提高访问表中一条或者多条记录的特定查询效率。因此,适当的索引调优是很重要的,未经调优的索引可能导致很多不良后果,比如:建立一个索引却从不使用,仅仅付出维护的代价;为了返回单一的记录而扫描多个文件;由于存在错误的索引,导致多表的连接操作持续几个小时的时间。
索引对数据库的性能影响:1、表扫描需要访问大量数据页,而索引可以避免表扫描,从而使每次查询只需访问索引页和少量的数据页即可;2、对于某些查询,数据可以从索引中获得,而无需访问数据库(索引覆盖):3、由于聚簇索引的插入是在数据页上分布进行的,因而避免了将表的最后一页作为“热点”进行大量的插入操作(Sybase):4、如果索引的顺序与order by子句的顺序相同,则通过索引查询可以避免排序的过程;5、索引(唯一索引)还可以使表中的数据唯一;6、索引在加快查询数据速度的同时,因为在数据更新时还要更新索引,因而会减慢数据更新速度。
(三)关系系统调优。现在市面上的数据库系统几乎都是关系数据库系统,由于关系系统所覆盖的应用领域不同,如果想使关系系统高效执行,就必须具体仔细的分析特定的应用。
1、表的设计及其规范化。应用设计的开始步骤之一就是表的设计,表是数据存储的载体,运行以后对表的修改牵涉很多,所以在设计之初就应该做好规范化工作。
一个关系模式结这分解可以得到不同关系模式集合,也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。
规范化固然重要,但是,虽然非规范化的关系存在很多的缺点,但是为了性能,有时却不得不按照逆规范化的思想来设计关系模式。这主要出现在某些特定的查询。一般来说,对于经常更新的关系,逆规范化会降低性能。但是在低更新率的情况下,逆规范化可能会提高性能。因此,一些应用采用逆规范化方法设计档案数据的模式,而使用规范化方法设计在线数据的模式。
2、查询调优。查询是数据库使用者进行的主要操作之一。在这方面,最初的调优方法是试用那些没有坏的影响的方法。大部分的变化,比如增加索引、改变模式或者修改事务的长度都对全局有影响,有时是有害的负面影响。而重写查询使之以更高的速度运行则只有有利的影响。
三、结语
数据库性能调优是知识密集型的学科,需要综合考虑各种复杂的因素。性能是数据库应用的永恒话题,也是衡量一个数据库系统成功与否的重要指标。但是,想让数据库达到最优性能从来就不是一件简单的任务,需要涉及很多方面的知识。如何让数据库性能更加优越,还有待我们在以后的应用中不断完善。