Sybase数据库性能调优
Windows/.Net/MSSQL October 26th, 2006 381 Views编者按:在现有软硬件条件下,充分发挥数据库系统的潜能(数据库性能调优)是DBA(数据库管理员)追求的最高境界。然而,数据库性能调优是一个非常复杂的问题,不仅需要潜心研究数据库的理论知识,更需要参考同行
的实践经验。本期我们特别为DBA选登了一篇有关这方面内容的文章,希望对您的工作有所启迪。文中提到的方法,主要针对Sybase数据库,但对DB2、Oracle等大型数据库系统同样也有借鉴意义。
全国铁路客票系统是一个典型的基于数据库的大型应用系统,经过多次的技术改进,现已能够比较全面充分地满足和适应客票发售和预订的需求,是铁路运输管理信息系统中的重点应用。系统采用Client/Server结构,后台使用Sybase数据库和Unix操作系统,中间由自行开发的中间件负责连接交易处理和数据库通信。
这样一个遍及全国大小车站、统管全国的铁路客票发售系统,其重要性不言而喻。特别是节假日铁路售票高峰期,客票主机一旦出现故障,造成停机,便会直接影响售票,极大地影响铁路正常运营。因此,如何深入调整Sybase数据库的性能,保证数据库的高可用性,以满足日益增长的客票网络的需求,是每一个地区中心和每一个车站的数据库管理员的重要课题。本文将结合铁路客票系统,对如何调整优化Sybase数据库的性能进行较深入的论述。
何谓数据库性能调优
数据库性能一般用两个方面的指标来衡量:响应时间和吞吐量。响应越快,吞吐量越大,数据库性能越好。不过,响应时间和吞吐量并不是都能一起得到改善的。Sybase数据库性能调优可以从四个方面进行:
● 操作系统级:对网络性能、操作系统参数、硬件性能等做改进。
● SQL Server级:调整存取方法,改善内存管理和锁管理等。
● 数据库设计级:采用降范式设计,合理设计索引,分布存放数据等。
● 应用程序级:采用高效SQL语句,合理安排事务,应用游标,处理锁。
本文将对除操作系统级以外的三个方面的内容进行讨论,其中SQL Server部分提到的概念只适用于Sybase数据库,但第三、第四方面讨论的内容同样适用于Sybase外的其他数据库。而且,以上各个方面的措施是相互关连的,具体到解决某一个性能问题,要综合应用。
在分析Sybase数据库的性能时,常要用到一些数据库系统本身提供的性能调优工具,以下是最常用的几个系统存储过程:

这里要特别提一下sp_sysmon存储过程,通过它可以得到数据库系统的性能基准报告,但只有在比较稳定的状态下产生时,方可作为参考和对照的依据。另外,为了对数据库性能进行调整,需要十分清楚数据库存储数据的底层细节,如数据页、索引页的物理结构、每一行的大小计算、不同类型列占用的宽度等问题,只有具备了这些知识,才能深入领会各种调优措施。
SQL Server级的调优
数据库性能优化的首要问题是内存管理。数据库占用的共享内存分成数据缓冲区(Data Cache)、存储过程缓冲区(Procedure Cache)等几部分。在ISQL下使用 “sp_configure ‘cache’”可以看到存储过程缓冲区所占百分比(Procedure Cache Percent)和整个数据缓冲区大小(Total Data Cache Size) 等参数。
存储过程缓冲区保存有以下对象的查询计划:存储过程、触发器、视图、规则、缺省、游标等。存储过程不可重入,即每个并发用户调用都会在内存中产生一个拷贝。
当存储过程、触发器、视图被装载到存储过程缓冲区时,被查询优化器优化,建立查询计划。如果存储过程在缓冲区中,被调用就不需要重新编译。如果存储过程缓冲区太小,存储过程就会经常被其他调入内存的存储过程覆盖掉,当再次被调用时,存储过程又被调入内存,再重新编译,用户请求因此不得不等待。最严重的情况,如果存储过程缓冲区不够,存储过程甚至都不能运行。所以在内存足够的情况下,存储过程缓冲参数应尽可能大一些。
数据缓冲区用来缓存数据页和索引页,给服务器增加物理内存以扩大数据缓冲区,是提高数据库性能最有效的方法。当然,如果不能增加内存,就只能通过减少存储过程缓冲区的比例等方法来扩大数据缓冲区了。
要把数据提前读入内存,有两种方式,即预取策略或大I/O策略(Prefetch Strategy)和取后马上丢弃策略(Fetch-and-Discard)、提示策略(Hints)等几种。可以在以下三个级别上分别设置表数据的预取策略(Prefetch Strategy,即大I/O策略):对象级、会话级、查询级。如果三个级别上都有设置,它们发生作用的优先顺序是:对象级 > 会话级 > 查询级。
在决策支持系统应用中常常需要较大的I/O,这时应该开放large I/O strategy预取策略。如果一个应用倾向于OLTP特征,用户可以在会话级关掉Prefetch来提高性能。同样,对于OLTP应用,还可关闭large I/O strategy预取策略。如果所取页不会有重用的情况,应开放fetch-and-discard策略。
锁的优化是数据库级调优的另一个重要内容。锁优化最重要的工作是设置页级锁升级成表级锁的阀限。要尽量避免页锁很快升级成表级锁,同时减少锁的争夺。
管理临时库和多引擎(Multiple Network Engines)也是数据库级调优的一个重要内容。管理临时库的一个重要原则是要避免临时表跨多个设备,可以把tempdb从master设备中分离出来,放到一个单独的设备上去。这样可以减少存取系统表时对I/O资源的争夺。多引擎是指操作系统使用了多个CPU。如果有多个CPU,可用sp_configure 来配置数据库的参数:在线引擎数(Max Online Engines)。可以扩展系统的网络I/O容量,将网络I/O分布到各个引擎,从而提高性能,以允许更多的用户连接。
为了改善数据库的性能,设备的优化也必不可少。把最常插入的表分区放在多个设备上,这样可以创建多个页链,从而改善多个并发插入时的性能,因为每一个插入都要找到页链,页链有多个,就允许多个插入同时进行。这一点,尤其适用于客票系统的存根表和订票存根表,所带来的性能改善会非常明显。
物理I/O的代价远大于逻辑I/O,所以要尽量减少磁盘进行物理I/O的次数,尽量多进行内存中的逻辑I/O。可以使用“statistics io”工具和sp_sysmon来观察磁盘I/O。可以配置使用大的I/O来减少物理I/O的次数,方法有三个,分别是用更多的磁盘、表和索引分开到不同的磁盘和增加一次I/O系统参数值的大小。
SQL Server总是为I/O请求建立一个磁盘检查的调度环。用sp_configure“I/O polling process count”来提高数值,加长环,可以降低引擎的检查次数,提高吞吐量。但较小的值一般有助于减少响应时间。

Recent Comments