时间:2021-07-01 10:21:17 帮助过:31人阅读
本文转载自:http://wenku.baidu.com/view/4b1f67d97f1922791688e801.html 在用SQLServer进行 系统 设计 时,正确、合理地 设计 数据库、索引、查询、选择合适的数据类型、 优化 SQL语句等可以达到提高 系统 性能 的目的。本文讨论 应用 系统 性能 优化 的方
本文转载自:http://wenku.baidu.com/view/4b1f67d97f1922791688e801.html
在用SQLServer进行系统设计时,正确、合理地设计数据库、索引、查询、选择合适的数据类型、优化SQL语句等可以达到提高系统性能的目的。本文讨论应用系统性能优化的方法,并且给出一些有益的建议。
数据库应用系统设计应包含两方面的内容:一是结构设计,也就是设计数据库框架或数据库结构;二是行为设计,即设计应用程序、事务处理等。
1 数据库设计
要在良好的SQL Server 方案中实现最优的性能,最关键的是要有一个很好的数据库设计方案。在实际工作中,许多SQL Server 方案往往是由于数据库设计得不好导致性能很差。合理的数据库设计是提高总体性能的最有效途径。
在设计数据库时应考虑的问题
① 应用程序的性能需求。设计数据库时必须利用SQL Server 中能够提高性能的功能。对于性能而言,在数据库大小和硬件配置之间权衡是很重要的。
② 要综合考虑用窄表还是用长数据表。用多的、有相互关系的窄表来代替很多列的长数据表,可以使排序和建立索引更为迅速。由于表窄,每个表中可以有少一些的索引,因此可以提高Insert 、Update 、Delete 等的速度,因为这些操作在索引多的清况下会对系统性能产生很大的影响。但表多会增加在获取数据时引用表的数目和其间的连接关系的复杂性,太多的表和复杂的连接关系会降低服务器的性能,因此在这两者之间需要综合考虑。
③ 正确合理地选择数据类型。在SQL Server 中数据是必不可少的,对每一属性选择什么样的数据类型很大程度上依据表的要求,但是在不违背表要求的前提下,选择适当的数据类型可以提高系统性能。与每个表列相关的数据类型应该反映数据所需的最小存储空间,对只含数值信息的字段尽量使用数字型,不要设计为字符型,这可提高查询和连接的性能。这是因为引擎在处理查询和连接时对于数字型只需要比较一次,而对字符型会逐个比较字符串中每一个字符。能使用smallint类型就不要用integer 类型,这样索引字段可以被更快地读取,而且可以在1个数据页上放置更多的数据行,因而也就减少了I/O操作。如果一个列内所有值的长度相差较大应尽可能的使用varchar / nvarchar 代替char / nchar ,因为变长字段存储空间小,可以节省存储空间,另外对于查询来说,在一个相对较小的字段内搜索效率显然要高些。如果一个列内所有值的长度都相同或者值的长度相差不大,使用固定长度列更高效。
2 应用程序设计
数据库应用系统设计优化一个重要的方面就是应用程序的优化。应用程序设计在决定使用SQL Server 的系统的性能方面起关键作用。下面给出一些基本的开发技巧和相关技术。
① 消除过多的网络流量。客户端和SQL Server 之间的网络往返通常是影响数据库应用程序性能的首要原因,甚至超过了服务器和客户端之间传送的数据量这一因素的影响。在设计应用程序时应筛选数据,尽可能地减少从远程数据源获取不必要的数据,将网络流量减到最小。
② 使用存储过程。使用存储过程可以极大地提高运行效率,可以独立于应用程序而对存储过程进行修改,可以设置用户通过存储过程对某些数据进行访问,并进行有限制的操作,从而保证表中数据的安全性。③ 使用SET Nocount 会话设置。如果存储过程中有多个语句,则默认清况下,SQL Server 在每个语句完成时给客户端应用程序发送一条消息,详细说明每个语句所影响的行数。如果确信应用程序不需要时,可使用SET Nocount 会话设置为应用程序禁用这些消息,由于该设置大量减少了网终流量,因此可显著提高性能。
④ 使用适中的结果集。检索没必要大的结果集并在客户端浏览将增加CPU和网络I/O的负载,使应用程序的远程使用能力降低并限制多用户可伸缩性。最好将应用程序设计为提示用户输入足够的信息,以便查询提交后生成大小适中的结果集。
⑤ 用批处理方式发送语句。为了提高程序的执行效率,在T-Sql语言编写的程序中,可以使用Go 语句将多条Sql 语句进行分隔,两个Go 之间的Sql 语句作为一个批处理。从应用程序一次性地发送到Sql server 服务器进行执行,加快了程序的传递和执行速度。
⑥ 系统的可扩充性。在设计时必须充分考虑到系统的可扩充性,使设计易于变动。一个设计优良的数据库系统应该具有一定的可伸缩性,应用环境的改变和新需求的出现一般不会推翻原设计,不会对现有的应用程序和数据造成大的影响,而只是在原设计基础上做一些扩充即可满足新的要求。
3 索引查询设计
设计索引和查询对于在SqlServer上取得良好的性能是十分重要的。
31 索引设计与优化
有效地设计索引可以提高性能。常用的索引主要分为聚集索引和非聚集索引。聚集索引保证数据库表中记录的物理顺序与索引顺序相同,检索效率比普通索引要高,但对数据增加、修改、删除的影响较大,因此聚集索引适合于固定表。非聚集索引不会影响数据表中记录的实际存储顺序、比聚集索引需要较少的存储空间,检索效率比聚集索引低,但对数据增加、修改删除的影响很小,适合于数据经常变更的表。在设计过程中,要根据查询设计准则,以查询的优化特点为基础设计素引,在设计索引时应考虑:① 使用窄的索引。比较窄的索引具有比较高的效率,对于比较窄的索引,在每页上将会有更多的索引行和更少的索引级别(相对于多索引和复合索引而言), 所以,缓存中能放置更多的索引页,这样也减少了I/O操作。
② 不要对经常被更新的列建立索引,否则会严重影响性能。
③ 不要对记录数目很少的表建立索引。对小型表进行索引可能不会产生优化效果。
④ 只对经常用来检索的字段建立索引。索引并不是越多越好,因为索引本身要占用一定的存储空间,而且当增加或更新数据时,数据库需要执行额外的操作来维护索引,这些操作在索引多的清况下会对系统性能产生很大的影响。在设计和创建索引时,应确保对性能的提高程度大于在存储空间和处理资源方面的代价。
⑤ 不能用null 作索引。如果某列存在空值,即使对该列建索引也不会提高性能。
32 查询设计与优化
数据查询是数据库的核心操作。对查询进行优化,应尽量避免全表扫描。对于应用程序,重点在于Sql语句的执行效率。SQLServer提供了Select 语句进行数据库的查询。具体的优化方法:
① 建立索引时应考虑在Where 及Order By或Group By 涉及的列上。
② 只指定需要的字段。除非需要表中的所有字段,否则不要使用Select * From 这样的语句。③ Where 子句限制下载的记录数。在执行一个查询时,除非完全需要,否则应该避免在一个表中无限制地读并处理所有的行。Where 子句设定的范围和条件越精确,向计算机传输的记录就越少,查询完成得也越快。
④ 应尽量避免在Where 子句中对字段进行Null 值判断。当字段中有Null 值时,可以在该字段上设置默认值。,确保表中该列没Null 值。如:Select ID From Table Where Num Is Null
可以在Num 字段上设置默认值。,然后这样查询:Select ID From Table Where Num =0
⑤ 应尽量避免在Where 子句中使用NOT 、!= 或<>操作符。因为这样的子句是排斥性的,而不是包括性的,所以在扫描整个表之前无法确定子句的选择性。
⑥ 应尽量避免色Where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描,除非建立了基于函数的索引。
如:Select ID From Table Where Substring(Name,1,3)='xx'
应改为:Select ID From Table Where Name Like 'xx%'
⑦ 对于连续的数值,能用Between就不要用In 。
如:Select ID From Table Where Num In(1,2,3)
可改为:Select ID From Table Where Num Between 1 And 3
⑧ 合理安排多个选择条件的排列顺序。选择条件的排列顺序对性能的影响较大,要提高查询的响应速度,就要将较严格的条件写在前面,较弱的写在后面。
4 结束语
在设计开发SqlServer数据库应用系统中,合理有效地利用上述方法固然能提高性能,但系统性能优化是一个复杂的过程,影响数据库系统性能的因素是很多的,而应用又各不相同,找出一个通用的优化方案是不现实的,在系统开发的过程中应根据实际清况选择合理的数据库系统设计和优化策略,这样才能充分利用数据库管理系统提供的高性能服务使应用系统充分发挥其高效的功能。