APP下载

指挥控制与数据库应用系统性能优化的研究与实践

2016-02-12王晓燕

太原学院学报(自然科学版) 2016年1期
关键词:命中率缓冲区语句

王晓燕

(太原学院,山西 太原 030032)

现代指挥控制体系,一般由信息收集分系统、信息传递分系统、信息处理分系统、信息显示分系统、决策监控分系统和执行分系统有机结合,组成一个统一的整体。但随着数据库规模的增大,数据积累的增多和处理业务复杂程度的增加,可能导致应用系统性能出现问题,影响系统的可靠性、抗毁性、保密性、抗干扰性、灵活性和互通性。解决问题的根本路径在于对数据库应用系统的设计开发和管理程度。

研究表明,数据库应用系统的性能出现问题有一半都是由系统的设计引起的。就数据库的性能优化来说,过程是较为复杂的,这是由于在将系统数据库设计出之前,软件设计师并没有办法对系统将来的用户业务处理需求有进一步的了解,所以在软件设计中有一定漏洞,导致系统运行一段时间后才出现这样或那样的问题。因而,提高oracle 数据库应用系统性能对于整个系统的顺利运行至关重要。本文针对当前数据库应用系统性能出现的问题介绍了在实践中总结的一些数据库应用系统性能优化的方法。

1 数据库系统性能的评价标准

数据库系统性能的评价标准主要有几个方面:一是系统的吞吐量。吞吐量是指数据库在单位时间内完成的SQL 的语句数量,如果把系统的数据处理量提高也可以同时提高数据库对数据处理的速度,在同样的资源环境下利用较少的时间做更多的工作。其计算方法用单位时间的事物量(tps)来表示。二是用户的相应时间。用户提交SQL 语句后,到获得结果集的第一行需要的时间,即应用做出反应的时间,单位时间为毫秒或秒。响应时间包括系统的服务时间和用户的等待时间。因而,可以通过提高数据库的吞吐量来减少系统的服务时间,另外,若要减少用户的等待时间,可以减少用户访问统一数据库资源的冲突率。三是数据库的命中率。用户所需要的数据全部都是通过缓冲区告诉缓存来存取的。也就是说,衡量用户是否能在内存中对数据量的需求得到满足的标准是缓冲区的告诉缓存命中率。其计算公式是告诉缓存命中总数除以对告诉缓存的查找总数[1]。四是内存的使用状况。一般内存的使用状况体现在共享内存、永久性内存和运行时候的内存三者的分配使用上。一般对内存使用的调整我们倾向于考虑把精力和时间用于解决可能产生最大利益的问题上,在使用见到最小的基础上已得到投资的最大回报。五是磁盘I/0。这是衡量数据库性能方面较为重要的一个指标,由于数据库对每一个数据的处理都要经过I/0 这样的活动来进行,而种种活动既可以在内存中也可以在磁盘上运行,我们可以通过减少一些没必要的I/0 活动内容,从而增加用户获得的吞吐量,缩短用户的响应时间。

2 数据库应用系统性能存在的问题

2.1 数据的连接方面

B/S 连接方式相对于传统的C/S 连接方式来说,虽然在一定程度上缓解了资源连接的压力,但是缺乏数据库连接池的管理,用户数量的增加和应用服务器的扩大会导致连接的数量无法受到控制而不断上升。

2.2 系统应用方式方面

数据库中业务流程处理缺乏合理的应用结构设计,单纯的数据关系很难承载多元的业务应用需求,在实际的业务系统中,业务流程在不断增加,现有数据库的分析统计和决策支持并不能满足实际的业务需要。

2.3 数据库设计方面

数据库的设计仅仅能应对简单的数据存储,但是用户数量在不断增加,原有的数据库整体分析和性能设计并不能满足日益剧增的用户量的需求,因而系统性能会随之下降。

2.4 数据库管理方面

数据库一定开发由于其本身管理员的能力有限而存在着许多不足,随着系统的不断增大,其系统的硬件配备和系统软件两方面有着先天不足,而且在管理维护中缺乏相应的成熟技术,因而提高数据库管理员数据库硬件软件研究水平也非常重要。

3 优化数据库性能的措施与策略

3.1 SQL语句优化

数据库对SQL 语句的执行速度快慢也决定着应用程序的执行速度快慢。因此,我们应该对SQL语句进行适当调整,就能提高数据库系统的性能。SQL 语句优化就是利用索引来减少表扫描的I/0 次数,以避免表搜索的发生,其原理是将性能较为低下的SQL 语句转换为性能相对优异的,但是目的相同的SQL 语句,将数据查找的路径简单化[2]。具体的操作方法如下:

首先,查找出有问题的SQL 语句。搜集统计数据,oracle 中可以通过DBMSSTATS 包进行,用于搜集有关连接数据行的统计数据,使用ANALYZE 命令可以搜集簇的数据情况,而其他情况可以使用DBMS -SATS 包。语法为 exec DBMS_SATS.gathertable_stats(“owname”,“tablename”,“partname”)。可以通过SQL Trace 工具对SQL 语句进行分析,利用命令ALTER SESSION SET SQL-TRACE=TRUE会话将SQL-TRACE 激活,通过在udump 管理区创建跟踪文件来了解各参数,如执行和返回数据的次数、解析、CPU 时间、库缓冲区命中率等。其次,是建立合适的SQL 语句。先建立合适的索引,其目的是为了提高查询效率,为了降低I/0 竞争,索引不应该和用户表空间建立在同一个磁盘上。此外,还应该尽量避免使用DSJTNITC、UNION、GROUP BY、ORDER BY等关键字,因为这些操作会启动SQL 引擎执行一些耗费资源的排序功能,因而增加运行时间。这些语句可以通过其他的方式来实现,因为oracle 是从上而下的顺序来解读语句的,所以我们如果把含有可过滤的数据条件写在where 子句的末尾,那么就可以适当加快SQL 的处理语句速度。例如:

SELECT A.*,B.*

FROM T_A A,T_B B

WHERE A.OP_DATE >='2006- 01- 01'

AND A.OP_DATE <='2007- 01- 01'

AND (A 和B 的关联条件).

另外,用having 子句有时候会比where 子句处理速度更长。因为where 子句可以把不必要的条件和记录过滤掉,所以它的运行效率比having 子句的要高。

将不合理SQL 语句寻找出并给与修改这种方法耗费的资源小,实施起来效果比较好,可以大范围的提高数据库应用系统性能,但是,这并不能从本质上优化系统的性能,因为建立索引会受到很多限制,比如表上的索引如果太多会对INSERT、DELETE 以及UPDATE 等有影响,而且,日志中记录了所有的操作,久而久之,磁盘I/0 的操作也会增加,数据量的加大最终导致系统性能也会下降。

3.2 数据库服务器的内存分配的调整

服务器内部参数调整极为复杂,对系统影响较大的参数一般包括共享池(Shared pool)、数据缓冲区 (Database Buffer Cache)日志缓冲区 (Redo log buffer)等。

数据库缓冲区(Database Buffer Cache)是把从磁盘中读取的数据块存放于内存缓存中,因而,如果数据库的缓冲区大,其储存的数据也会相应的加大。这样的话,磁盘读取数据操作所花的时间就会减少,因此间接地使得系统的运行效率得到提高。我们可以利用数据字典来得知数据缓冲区的活动状况,如果命中率小于0.85 的话,就可以为数据块缓冲区分配更多内存。

共享池(Shared pool)包括两个部分,即数据字典缓冲区和库告诉缓存区,它的作用是储存用户最近使用的一些语句,并且利用有效的方式对其进行管理。因而,共享池大小是否合适体现在两者的命中率上面。库缓冲区的设置应该适度,不能太大,也不可太小,如果设置太大的话会提高CPU 的使用率,而如果设置太小会使语句源源不断地被装入而影响系统的性能。输入命令select (1-sum(reloads/sum(pins) from v$librarycache 来查询其命中率,若命中率<0.95,那么可以增加shared-poolsize 值来提高其命中率。另外,输入命令select sum (1-(getmisses)/(sum(gets)+sum(getmisses))) form v$rowcache 来对数据字典高速缓存进行查询,若是结果<0.85,那么通过增大共享池的大小可以提高字典高速缓存可以使用的内存数量。

日志缓冲区(Redo log buffer)若是分配小就缺乏足够的空间来重做条目而需要进行等待,通过输入Select name、value from v$sysstat where name ='redo log space requests' 进行查询,查询结果应该接近零,若非如此的话,每次把Log-buffers 增大5%来输入上面的语句进行查询,一直到最后结果接近零为止。

3.3 利用数据库分区和并行技术

我们可以将数据库运行的各项操作进行分解,对操作的记录数进行严格控制,或者将几项操作同时进行,这样可以提高数据库应用系统的执行率,从而优化其性能。使用数据库的分区技术是一个很好的办法,它可以使得数据库查询的速度更为快捷、有效,而且增加了数据库的可用性。在进行查询的初期,优化器就可以将所需查询数据的所在区辨识和识别出来,从而未包含所需查询数据的分区可以避免读取数据,从而减少查询的时间,提高其查询效率[3]。而且,数据库分区后,可以把使用频率不同的表建立在不同的设备上,合理高效地分布表空间。另外,除了数据库分区,几乎所有的Oracle 数据库的操作都支持并行技术的,包括了查询、数据的加载和插入等。并行指的是几个处理器同时投入一条命令的运行处理工作中,所以,用户在创建数据对象的时候,可以设定并行参数使得数据库系统性能得以提升。这样做的好处是系统的运行效率得到了提高,特别是大数据量的访问支持情况较好,但是由于数据库分区需要对数据表的增长趋势进行独立分析,因而需要大量的硬件资源和专业的数据库管理知识,要求十分高,这从一定程度上降低了其可行性。

3.4 软件测试的优化

软件性能由于压力测试进行不充分很多时候都不能满足用户的需求,因为用户有时不但需要软件完成一定功能,更加需要软件来支持其业务的顺利运行。所以,我们若是要测试软件系统应该着重关注它是否能有效的处理用户的业务。由于系统通常在运行一段长的时间后,处理速度和性能都会降低,所以我们在测试软件的时候可以运用数据对其测试,应该注意的是数据量要大,否则难以测出系统性能。比如,oracle 数据库中,如果我们设置pctfree 和pctused 的参数的话,数据块可能会占据一半的空间导致系统性能下降,也有可能使数据库记录连接。这些问题在系统运行了一段时间之后才会被发觉,因而加强对数据库软件测试非常重要。另外,若是只使用一个测试,我们经常难以发现从真正意义上了解软件的应用和负载情况,所以,我们测试可以在好几个并发运行模块的情况下进行,比如,如果两个软件模块都在向同一个表中插入记录,查询表中数据,而运行方式相同,两个不同模块的运行很可能导致最后检测的数据出现不一样的情况。如果是这样的情况,我们只能在同一时间内好几个用户同时进行软件的操作,通过这种测试方式兴许能找到问题所在。

4 结束语

数据库在现代指挥控制领域得到广泛应用,日益增加的业务数据和日渐繁复的业务处理,要求对其系统的研发和管理技术在学术和实践中不断进步,尤其是对于数据库的性能优化,有待于我们不断地深入研究和探索合理的方法提升数据库性能。笔者根据实践讨论了通过SQL 语句优化、调整服务器分配、利用数据库分区和并行技术和对软件测试的优化等方式对系统数据进行性能优化,除此之外,通过更多的相关人员的不懈努力和积极探寻,必然能找到更多新的提高数据性能办法。

猜你喜欢

命中率缓冲区语句
嵌入式系统环形缓冲区快速读写方法的设计与实现
重点:语句衔接
夜夜“奋战”会提高“命中率”吗
2015男篮亚锦赛四强队三分球进攻特点的比较研究
精彩语句
投篮的力量休斯敦火箭
关键链技术缓冲区的确定方法研究
试析心理因素对投篮命中率的影响
如何搞定语句衔接题
地理信息系统绘图缓冲区技术设计与实现