伍 峰
(中国铁路总公司 信息技术中心,北京 100844)
铁路货运站生产管理信息系统(以下简称货运站系统)在上海闵行车站试运行的一段时间内,随着历史数据的积累,各种业务的增多,系统运行速度逐渐减慢,响应时间逐渐增长,效率变低,稳定性变差。为有效地解决上述问题,本文详细分析了常用的Oracle数据库优化技术,结合货运站系统的数据库特点有针对性地研究了数据库的升级、完善与优化策略,通过采取数据库优化技术,货运站系统的运行状况得到了很大的改善,进一步验证了数据库优化方法的可行性,为货运站系统的进一步推广和实施奠定了基础。
为高效率使用数据库,在确保功能的同时,应用程序的设计应尽量把握如下原则:(1)尽量减少应用程序与数据库的交互频率;(2)注意应用程序中对数据库操作的提交与回滚,避免数据表的锁死;(3)减少与数据库交互过程中网络传输的数据量;(4)尽可能地多重复利用客户端与数据库的连接池,避免资源浪费;(5)设计时要考虑CPU及内存的开销情况;(6)应用程序最好不使用数据库游标。
数据库表空间是一个逻辑结构,是Oracle数据库信息物理存储的一个逻辑视图,它和操作系统一样是不可见的。在数据库设计阶段,需要注意以下几点:(1)SYSTEM表空间用于存放Oracle系统的有关信息,为提高数据库效率,可适当增加SYSTEM表空间大小,并避免一般用户将对象建立在SYSTEM表空间上;(2)对于Oracle数据库的应用系统,都应该为其创建对应的数据库用户、数据表空间、索引表空间和临时表空间;(3)随着系统的运行,数据量增长,数据表空间会产生碎块,影响Oracle数据库性能,所以应定期检查数据库表空间的使用情况;(4)为提高数据库数据的迁移速度,在迁移Oracle数据库数据时,设置表空间为“快速更新,不生成重做日志且不可恢复”状态,待数据迁移完成后,再将表空间设置成“生成重做日志且不可恢复”。
“中间表”指中间数据表,合理的设计中间数据表在优化数据库的过程中非常必要。一方面,前台应用程序操作与后台数据库处理之间的中间数据表,有利于提高数据库效率。(1)当应用程序某个特定操作需要触发数据库多个表发生变化时,可设计中间数据表记录前台操作,利用数据库存储过程和触发器等数据库程序分析中间表中的记录,从而触发相关多个表的变化。(2)当多个客户端的应用程序需要同时访问数据库同一张表并进行各种操作时,应用程序将每个客户端的访问记录在中间表内,后台数据库程序通过分析中间表的内容,按顺序逐个对目标表执行相应操作,在保证高效地同时,避免逻辑冲突。
另一方面,系统与系统之间的中间信息共享表,有利于提高系统安全和可靠性。当多个系统需要共享数据时,可使用中间表存储接口信息,系统之间只需访问中间表就可以实现信息的共享。
数据库索引的原理非常简单,但在复杂的数据表中正确使用索引却不是易事,需要多方面全面考虑,并且具体问题具体分析。在创建数据库索引时,需要考虑下列原则:(1)将索引和数据表建立在不同的表空间上,从而提高数据库效率;(2)尽可能最大限度地发挥索引的作用,保证创建的索引经常应用于WHERE子句中;(3)对于数据查询频繁的大型分区表,根据分区创建的分区索引会影响查询效率;(4)对于频繁插入和更新的数据表,索引越多系统CPU和I/O的负担就越重,所以每张表尽可能不要超过5个索引;(5)创建好索引后,尽量避免改变索引列的类型。
SQL语句的效率直接影响了数据库的性能,可通过以下几个方面对SQL语句进行优化:(1)减少对数据库的查询次数,可以减少对数据库系统资源的请求。具体可通过快照和显形图等分布式数据库对象实现;(2)从WHERE子句、SELECT子句和数据库函数等方面入手,提升SQL语句处理速度;(3)尽量减少DISTINCT,U NION,MINUS,INTERSECT,ORDER BY等耗费数据库资源的使用;(4)去除不必要的大型表的全表扫描,缓存小型表的全表保存。
2.1.1 表空间设计
创建Oracle数据库后,适当扩充SYSTEM表空间的容量,根据业务数据量分析,为货运站系统分别创建独立的数据表空间、临时表空间和索引表空间。
2.1.2 将多个数据库服务器的用户整合至1台服
务器上
梳理货运站系统涉及到的所有数据库用户,对用户性质及作用进行分类,将功能相似的用户进行合并,将分散在不同数据库服务器上的用户迁移至同一台数据库服务器,删除大量不必要的数据链路,简化相对应的视图。
2.1.3 将多个用户下的对象整合至一个用户下
对于货运站系统使用的其他数据库用户对象,通过赋权、创建同义词、视图等方式,整合至货运站系统的数据库用户下。这样,前台应用程序对其它用户对象的访问只需访问货运站系统数据库用户即可实现。
2.1.4 合理创建索引
根据数据表中数据量大小,采取不同策略,为货运资源动作表、系统参数表等数据量小的表创建主键;为运单表、装载清单表、货运装卸七甲表等数据量非常大的表增加索引。根据字段使用频率,将运单填报日期、装卸车时间、车站电报码等经常作为连接条件、筛选条件、聚合查询、排序的字段建成索引。把运单号、发站、填报日期等经常一起出现的字段组合在一起,组成组合索引。
2.1.5 利用数据库编程实现复杂业务逻辑
数据库程序包括数据库存储过程、触发器和函数。将复杂业务逻辑通过数据库程序实现可以减少与数据库交互过程中的网络流量,并能更充分地利用数据库的预编译和缓存功能。货运站系统中,通过编写存储过程程序实现货报一、货报二、货报三的统计功能;通过编写触发器程序实现货场资源数据同步功能;通过编写函数程序和定时任务实现外部接口数据共享的功能。
2.1.6 合理利用视图
货运站系统中,存在大量复杂的查询需求,诸如货物、清单、车辆、货区货位等信息的关联查询。进行数据库优化时,将客户端程序中这些复杂的查询语句前移至数据库,通过视图实现,这样客户端程序只需查询相应视图即可。
2.1.7 优化SQL语句
(1)根据Oracle采用自下而上顺序解析WHERE子句的原理,优化SQL语句中的WHERE子句;(2)尽可能使用DECODE等高效数据库函数,减少处理时间;(3)检查所有的SQL语句,用TRUNCATE语句替代DELETE语句,减少数据库资源的调用,缩短执行时间;(4)根据业务需要,修改了低效的全表扫描查询语句;(5)查询语句中最大限度地使用创建的索引。
创建中间表并编写数据库程序实现货运站系统货场资源管理的功能。具体过程,如图1所示。
图1 中间表处理流程
根据业务需求,分析货运站系统与其它系统的关系,设计共享用户,创建中间数据表,实现货运站系统、计划系统和现车系统的信息共享。各个系统不是直接访问其它系统的数据库,而是通过同义词和视图等方式只对数据库共享用户下的中间表进行操作。这样,大大提升了货运站系统数据库的稳定性和安全性。
针对减少数据量,提高数据库访问效率的优化,区别于货运站系统运行时连接的生产用户,创建对应的历史用户,利用存储过程和定时任务,将一段时期内重要的历史数据定时备份至历史用户下,并根据自身需求,定时删除历史用户下不需要的垃圾数据,如图2所示。
在优化货运站系统数据库,提高数据库效率的过程中,采用了许多存储过程、触发器、函数等数据库程序,这些程序在后台运行,不易观测运行状态,不能及时发现运行时出现的问题。通过编写程序并优化已有的存储过程对数据流转关键环节的数据库程序进行监控,将出现问题的SQL代码,SQL错误信息等内容保存至监控表,并由客户端程序展示在前台页面上,便于维护。
通过以上几方面对货运站系统Oracle数据库的优化工作,解决了不断增大的数据量对系统造成的影响,提升了货运站系统的运行速度,使后台数据库的结构更加清晰,系统运行更加高效,维护更加便利。货运站系统数据库的优化充分发挥Oracle数据库的高效性,不仅提升了单个车站数据库的使用效率,而且为今后多个车站快速而又互不干扰地共享同一数据库打下了坚实的基础。
[1] 王 珊,陈 红.数据库系统原理教程[M].北京:清华大学出版社,2002,6.
[2] 文 平. Oracle数据库性能优化的艺术[M]. 北京:机械工业出版社,2012,7.
[3] Craig S.Mullins.数据库管理一实践与过程[M].李天柱,任建利,肖艳芹,译.北京:电子工业出版社,2003,5.
[4] Ryan K.Stephens,Ronald R.Plew.SQL自学通[M].北京:机械工业出版社,1998,10.