浅谈基于SQL Server的数据库性能优化
作者:熊理扬 赵越
来源:《电脑迷·中旬刊》2018年第03
        摘要:在开发以SQL Server数据库为中心的应用程序时,为了开发出性能较高的应用程序,应从数据库设计、存储过程、事务和批处理等因素考虑对数据库应用程序性能进行优化。
        关键词:SQL Server;数据库;性能优化
        前言:SQL ServerMicrosoft研制开发的一个大型Client/Server方式的数据库管理系统。在开发以SQL Server数据库为中心的应用程序时,为开发出性能较高的应用程序,应从数据库设计、存储过程、事务和批处理等因素考虑对数据库应用程序性能的影响。
        1 优化SQL Server数据库设计
        在基于SQLServer数据库的应用系统中对数据库进行设计时,通常根据3类范式对数据进行规范化。目的是为了在表中消除冗余数据,减少数据库中的总数据量,相应地提高系统查询性能。在SQL Server中,数据按页存放,每一页含有一个页头和若干数据行,数据行的大小由
行中所含字段数目和数据类型确定,行的大小对性能有较大影响,小数据行的好处是每页可存放较多行,这样在高速缓存中能存放更多行,减少从磁盘取数据的I/O时间。在数据行中,有定长列和变长列之分,变长列比定长列开销大。在SQL Server中,含有空值的列作为变长列处理,因此,从性能角度考虑,对每列应指定NOTNULL并建立默认值。数据库对象以页为单位存储于磁盘上,页间以指针构成页链,普通表将页连成一串,对表的分区是为了表创建多个页链。采用表分区技术,可获得以下结果:(1)对查询和拷贝操作,可由多个线路并发操作各自分区,提高执行速度;(2)对插入操作,分区为插入提供多个插入点,减少页互锁竞争,加快事务执行度。在数据库设计时,要合理有效使用锁。数据库锁是为解决不同用户同时对数据库中同一数据进行更新操作时可能带来数据不一致性而采用的控制技术,但锁的运用同时会降低系统处理效率,若运用不当,甚至会出现死锁的情况。在设计时,须采用以下相应措施:(1)各事务按同一顺序存取共享资源以免产生死锁;(2)使用短事务。需要互斥锁的事务,应避免用户干预事务上锁;(3)减少数据页和索引页中行数量,减少竞争机会,提高系统性能;(4)使用存储过程减少锁冲突。
        2 事务和批处理对应用程序性能的影响
        适当使用Transact—SQL的主要目的是减少服务器与客户端间传输的数据量。减少传输数据量通常可缩短完成逻辑任务或事务所需时间。长时间运行事务对单个用户可能很好,但扩展到多个用户则表现很差。为支持事务一致性,数据库须自开始在事务内获取对共享资源的锁后,一直将该锁控制到事务提交为止。如其他用户需访问同一资源,须等待。随着个别事务变长,等待锁的队列和其他用户也变长,系统吞吐量随之减少。长事务还增加死锁可能性,当两个或更多用户同时等待互相控制的锁时会发生死锁。可用于缩短事务持续时间的技术包括:(1)在应用程序的要求内尽快提交事务更改。应用程序常将大的批处理作业作为单个工作单元(事务)执行。(2)利用SQL Server语句批处理,是一种一次将多个Transact—SQL语句从客户端发送到SQL Server的方法,减少到服务器的网络往返次数。(3)对重复操作使用参数数组。例如:开放式数据库连接(ODBCSQL Param Options函数允许将单个Transact—SQL语句的多个参数集以一个批处理形式发送到服务器,也可减少往返次数。可使用数据库设计说明书范文SQL事件探查器监视、筛选和捕获所有从客户端应用程序发送到SQL Server的调用。通常可揭示因对服务器的不必要调用而导致的意外应用程序开销。探查器还显示可将当前单独发送到服务器的语句放入批处理中的机会。3、有效的使用存储过程。如何充分利用网络资源、减少网络通信量是提高应用查询性能的一个重要因素,而存储过程的
使用,是减少网络通信量、加快执行速度的必要环节。(1)存储过程的使用。存储过程是个被命名的存储在服务上的Transact—SQL语句集合。在第1次执行时对其进行编译,存储过程驻留在内存中,省去重新分析、重新优化和重新编译。另外,存储过程封装重复工作的一种方法,是一种模块化的程序设计,存储过程支持用户声名的变量,条件执行和其它有用的编程功能。在Client/Server的应用程序中,使用存储过程可以方便地进行程序设计,减少程序员的工作量。(2)存储过程对应用程序性能的影响。所有设计优良的SQL Server应用程序都应使用存储过程。不论是否将应用程序的业务逻辑写入存储过程都应如此。甚至连没有业务逻辑组件的标准Transact—SQL语句,在用参数打包成存储过程后也能获得性能收益。编译进存储过程的Transact—SQL语句在执行时可省去大量处理。存储过程的另一优点是客户端执行请求使用网络的效率比将等效的Transact—SQL语句发送到服务器高。例如,假设应用程序需要将一个大的二进制插入image数据列。为使用INSERT语句发送数据,该应用程序须将二进制值转换为字符串(其大小翻倍),然后发送到服务器。服务器再将该值转换回二进制格式以存储在image列中。相反,应用程序可创建下列格式的存储过程
        CREATE PROCEDURE P@p1 imageAS INSERT T VA-LUES@p1
        当客户端应用程序请求执行过程P时,image参数值将一直以二进制格式发送到服务器,节省处理时间并减少网络流量。如果SQL Server存储过程中包含业务服务逻辑,因为业务服务逻辑将处理移动到数据,而不是将数据移动到处理,因而存储过程能提供更大的性能收益。
        结语:在实际开发中,要提高SQL Server数据库应用程序性能,应以减少系统开销和提高执行性能为目标,需据系统开发环境和需求综合各方面因素平衡各种提高性能方法,选择最佳方案。
        参考文献:
        [1]Patrick O'Neil Elizabeth O'Neil.数据库原理编程与性能[M].北京:机械工业出版社.2002
        [2]微软公司.Administering a Microsoft SQL Server 2000 Database[M].北京:清华大学出版社.2001

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。