如何提高SQL Server的性能
2006-02-22 11:24
351 查看
如何提高SQL Server的性能
朱二(2006.2 转载请注明作者)
如何提高SQL Server的性能,充分发挥软硬件的性能,是每一个SQL Server用户都关心的问题,下面我们分别从硬件、数据库设计、联合数据库服务器、服务器性能配置选项、应用程序设计五个方面分别进行阐述。
一、硬件:
1、处理器(CPU)
(1)采用多处理器
(2)采用更快速的处理器
2、内存
(1)增大内存容量
(2)采用访问速度更快的内存
3、RAID(独立磁盘冗余阵列)
(1)RAID-0,也称条带,提高写速度
(2)RAID-1(磁盘镜像和双工),提高读速度
(3)RAID-5(带奇偶的磁盘条带集),提高写速度
二、联合数据库服务器
采用分布式分区视图可用于实现数据库服务器联合体。
将一个表的数据进行分区,分别存放在多个服务器上,可显著优化系统的性能。
三、数据库设计
1、tempdb的设计
(1)使 tempdb 数据库得以按需自动扩展。这确保在执行完成前不终止查询,该查询所生成的存储在 tempdb 数据库内的中间结果集比预期大得多。
(2)将 tempdb 数据库文件的初始大小设置为合理的大小,以避免当需要更多空间时文件自动扩展。如果 tempdb 数据库扩展得过于频繁,性能会受不良影响。
(3)将文件增长增量百分比设置为合理的大小,以避免 tempdb 数据库文件按太小的值增长。如果文件增长幅度与写入 tempdb 数据库的数据量相比太小,则 tempdb 数据库可能需要始终扩展,因而将妨害性能。
(4)将 tempdb 数据库放在快速 I/O 子系统上以确保好的性能。在多个磁盘上条带化 tempdb 数据库以获得更好的性能。使用文件组将 tempdb 数据库放在除用户数据库所使用的磁盘之外的磁盘上。
2、利用文件组
在不同的磁盘上创建文件组,将访问频繁的表建立在该文件组上。
3、设计合适的索引 ,请参见索引英雄一文
四、配置服务器性能选项
1、使用内存配置选项优化服务器性能
(1)min server memory
(2)max server memory
(3)max worker threads
(4)index create memory
(5)min memory per query
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->优化服务器性能->使用内存配置选项优化服务器性能
2、使用 I/O 配置选项优化服务器性能
(1)recovery interval
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->优化服务器性能->使用 I/O 配置选项优化服务器性能
3、使用 Windows NT 选项优化服务器性能
(1)最大化吞吐量
(2)配置服务器任务调度
(3)配置虚拟内存
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->优化服务器性能->使用 Windows NT 选项优化服务器性能
五、应用程序的设计
(1)消除过多的网络流量。
客户端和 SQL Server 之间的网络往返通常是数据库应用程序性能较差的首要原因,甚至超过了服务器和客户端之间传送的数据量这一因素的影响。网络往返描述在客户端应用程序和 SQL Server 之间为每个批处理和结果集发送的会话流量。通过使用存储过程,可以将网络往返减到最小。例如,如果应用程序根据从 SQL Server 收到的数据值采取不同的操作,只要可能就应直接在存储过程中做出决定,从而消除过多的网络流量。
如果存储过程中有多个语句,则默认情况下,SQL Server 在每个语句完成时给客户端应用程序发送一条消息,详细说明每个语句所影响的行数。大多数应用程序不需要这些消息。如果确信应用程序不需要它们,可以禁用这些消息,以提高慢速网络的性能。请使用 SET NOCOUNT 会话设置为应用程序禁用这些消息。
有关SET NOCOUNT,请参见SQL SERVER联机丛书->Transact-SQL 参考->SET NOCOUNT
(2)使用小结果集。
检索没必要大的结果集(如包含上千行)并在客户端浏览将增加 CPU 和网络 I/O 的负载,使应用程序的远程使用能力降低并限制多用户可伸缩性。最好将应用程序设计为提示用户输入足够的信息,以便查询提交后生成大小适中的结果集。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->使用高效数据检索优化应用程序性能
可帮助实现上述目标的应用程序设计技术包括:在生成查询时对通配符进行控制,强制某些输入字段,不允许特殊查询,以及使用 TOP、PERCENT 或 SET ROWCOUNT 等 Transact-SQL 语句限制查询返回的行数。
有关TOP和PERCENT,请参见SQL SERVER联机丛书->访问和更改关系数据->查询基础知识->使用选择列表->使用 TOP 和 PERCENT 限制结果集
有关SET ROWCOUNT,请参见SQL SERVER联机丛书->Transact-SQL 参考->SET ROWCOUNT
(3)允许在用户需要重新控制应用程序时取消正在执行的查询。
应用程序决不应强迫用户重新启动客户机以取消查询。无视这一点将导致无法解决的性能问题。如果应用程序取消查询(例如使用开放式数据库连接 (ODBC) sqlcancel 函数取消查询),应对事务级别予以适当的考虑。例如,取消查询并不会提交或回滚用户定义的事务。取消查询后,所有在事务内获取的锁都将保留。因此,在取消查询后始终要提交或回滚事务。同样的情况也适用于可用于取消查询的 DB-Library 和其它应用程序接口 (API)。
(4)始终实现查询或锁定超时。
不要让查询无限期运行。调用适当的 API 以设置查询超时。例如,使用 ODBC SQLSetStmtOption 函数。
有关设置查询超时的更多信息,请参见ODBC API文档。
有关设置锁定超时的更多信息,请参见SQL SERVER联机丛书->访问和更改关系数据->锁定->在 SQL Server 中自定义锁定->死锁->"自定义锁超时"。
(5)不要使用不允许显式控制发送到 SQL Server 的 SQL 语句的应用程序开发工具。
如果工具基于更高级的对象透明地生成 Transact-SQL 语句,而且不提供诸如查询取消、查询超时和完全事务控制等关键功能,则不要使用这类工具。如果应用程序生成透明的 SQL 语句,通常不可能维护好的性能或解决性能问题,因为在这种情况下不允许对事务和锁定问题进行显式控制,而这一点对性能状况至关重要。
(6)不要将决策支持和联机事务处理 (OLTP) 查询混在一起。
有关更多信息,请参见SQL SERVER联机丛书->创建和维护数据库->数据库->数据库设计考虑事项->"联机事务处理与决策支持"。
(7)只在必要时才使用游标。
游标是关系数据库中的有用工具,但使用游标完成任务始终比使用面向集合的 SQL 语句花费多。
当使用面向集合的 SQL 语句时,客户端应用程序让服务器更新满足指定条件的记录集。服务器决定如何作为单个工作单元完成更新。当通过游标更新时,客户端应用程序要求服务器为每行维护行锁或版本信息,而这只是为了客户端在提取行后请求更新行。
而且,使用游标意味着服务器通常要在临时存储中维护客户端的状态信息,如用户在服务器上的当前行集。为众多客户端维护这类状态信息需消耗大量的服务器资源。对于关系数据库,更好的策略是让客户端应用程序快速进出,以便在各次调用之间不在服务器上维护客户端的状态信息。面向集合的 SQL 语句支持此策略。
然而,如果查询使用游标,请确定如果使用更高效的游标类型(如快速只进游标)或单个查询能否更高效地编写游标查询。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->使用高效数据检索优化应用程序性能
(8)使事务尽可能简短。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"事务和批处理对应用程序性能的影响"。
(9)使用存储过程。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"存储过程对应用程序性能的影响"。
(10)使用 Prepared Execution 来执行参数化 SQL 语句。
有关更多信息,请参见SQL SERVER联机丛书中对"Prepared Execution (ODBC)详细介绍"。
(11)始终处理完所有结果。
不要设计或使用在未取消查询时就停止处理结果行的应用程序。否则通常会导致阻塞和降低性能。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"了解和避免阻塞"。
(12)确保将应用程序设计为可避免死锁。
有关更多信息,请参见SQL SERVER联机丛书->访问和更改关系数据->锁定->在 SQL Server 中自定义锁定->死锁->"将死锁减至最少"。
(13)确保已设置所有能够优化分布式查询性能的适当选项。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"优化分布式查询"。
朱二(2006.2 转载请注明作者)
如何提高SQL Server的性能,充分发挥软硬件的性能,是每一个SQL Server用户都关心的问题,下面我们分别从硬件、数据库设计、联合数据库服务器、服务器性能配置选项、应用程序设计五个方面分别进行阐述。
一、硬件:
1、处理器(CPU)
(1)采用多处理器
(2)采用更快速的处理器
2、内存
(1)增大内存容量
(2)采用访问速度更快的内存
3、RAID(独立磁盘冗余阵列)
(1)RAID-0,也称条带,提高写速度
(2)RAID-1(磁盘镜像和双工),提高读速度
(3)RAID-5(带奇偶的磁盘条带集),提高写速度
二、联合数据库服务器
采用分布式分区视图可用于实现数据库服务器联合体。
将一个表的数据进行分区,分别存放在多个服务器上,可显著优化系统的性能。
三、数据库设计
1、tempdb的设计
(1)使 tempdb 数据库得以按需自动扩展。这确保在执行完成前不终止查询,该查询所生成的存储在 tempdb 数据库内的中间结果集比预期大得多。
(2)将 tempdb 数据库文件的初始大小设置为合理的大小,以避免当需要更多空间时文件自动扩展。如果 tempdb 数据库扩展得过于频繁,性能会受不良影响。
(3)将文件增长增量百分比设置为合理的大小,以避免 tempdb 数据库文件按太小的值增长。如果文件增长幅度与写入 tempdb 数据库的数据量相比太小,则 tempdb 数据库可能需要始终扩展,因而将妨害性能。
(4)将 tempdb 数据库放在快速 I/O 子系统上以确保好的性能。在多个磁盘上条带化 tempdb 数据库以获得更好的性能。使用文件组将 tempdb 数据库放在除用户数据库所使用的磁盘之外的磁盘上。
2、利用文件组
在不同的磁盘上创建文件组,将访问频繁的表建立在该文件组上。
3、设计合适的索引 ,请参见索引英雄一文
四、配置服务器性能选项
1、使用内存配置选项优化服务器性能
(1)min server memory
(2)max server memory
(3)max worker threads
(4)index create memory
(5)min memory per query
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->优化服务器性能->使用内存配置选项优化服务器性能
2、使用 I/O 配置选项优化服务器性能
(1)recovery interval
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->优化服务器性能->使用 I/O 配置选项优化服务器性能
3、使用 Windows NT 选项优化服务器性能
(1)最大化吞吐量
(2)配置服务器任务调度
(3)配置虚拟内存
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->优化服务器性能->使用 Windows NT 选项优化服务器性能
五、应用程序的设计
(1)消除过多的网络流量。
客户端和 SQL Server 之间的网络往返通常是数据库应用程序性能较差的首要原因,甚至超过了服务器和客户端之间传送的数据量这一因素的影响。网络往返描述在客户端应用程序和 SQL Server 之间为每个批处理和结果集发送的会话流量。通过使用存储过程,可以将网络往返减到最小。例如,如果应用程序根据从 SQL Server 收到的数据值采取不同的操作,只要可能就应直接在存储过程中做出决定,从而消除过多的网络流量。
如果存储过程中有多个语句,则默认情况下,SQL Server 在每个语句完成时给客户端应用程序发送一条消息,详细说明每个语句所影响的行数。大多数应用程序不需要这些消息。如果确信应用程序不需要它们,可以禁用这些消息,以提高慢速网络的性能。请使用 SET NOCOUNT 会话设置为应用程序禁用这些消息。
有关SET NOCOUNT,请参见SQL SERVER联机丛书->Transact-SQL 参考->SET NOCOUNT
(2)使用小结果集。
检索没必要大的结果集(如包含上千行)并在客户端浏览将增加 CPU 和网络 I/O 的负载,使应用程序的远程使用能力降低并限制多用户可伸缩性。最好将应用程序设计为提示用户输入足够的信息,以便查询提交后生成大小适中的结果集。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->使用高效数据检索优化应用程序性能
可帮助实现上述目标的应用程序设计技术包括:在生成查询时对通配符进行控制,强制某些输入字段,不允许特殊查询,以及使用 TOP、PERCENT 或 SET ROWCOUNT 等 Transact-SQL 语句限制查询返回的行数。
有关TOP和PERCENT,请参见SQL SERVER联机丛书->访问和更改关系数据->查询基础知识->使用选择列表->使用 TOP 和 PERCENT 限制结果集
有关SET ROWCOUNT,请参见SQL SERVER联机丛书->Transact-SQL 参考->SET ROWCOUNT
(3)允许在用户需要重新控制应用程序时取消正在执行的查询。
应用程序决不应强迫用户重新启动客户机以取消查询。无视这一点将导致无法解决的性能问题。如果应用程序取消查询(例如使用开放式数据库连接 (ODBC) sqlcancel 函数取消查询),应对事务级别予以适当的考虑。例如,取消查询并不会提交或回滚用户定义的事务。取消查询后,所有在事务内获取的锁都将保留。因此,在取消查询后始终要提交或回滚事务。同样的情况也适用于可用于取消查询的 DB-Library 和其它应用程序接口 (API)。
(4)始终实现查询或锁定超时。
不要让查询无限期运行。调用适当的 API 以设置查询超时。例如,使用 ODBC SQLSetStmtOption 函数。
有关设置查询超时的更多信息,请参见ODBC API文档。
有关设置锁定超时的更多信息,请参见SQL SERVER联机丛书->访问和更改关系数据->锁定->在 SQL Server 中自定义锁定->死锁->"自定义锁超时"。
(5)不要使用不允许显式控制发送到 SQL Server 的 SQL 语句的应用程序开发工具。
如果工具基于更高级的对象透明地生成 Transact-SQL 语句,而且不提供诸如查询取消、查询超时和完全事务控制等关键功能,则不要使用这类工具。如果应用程序生成透明的 SQL 语句,通常不可能维护好的性能或解决性能问题,因为在这种情况下不允许对事务和锁定问题进行显式控制,而这一点对性能状况至关重要。
(6)不要将决策支持和联机事务处理 (OLTP) 查询混在一起。
有关更多信息,请参见SQL SERVER联机丛书->创建和维护数据库->数据库->数据库设计考虑事项->"联机事务处理与决策支持"。
(7)只在必要时才使用游标。
游标是关系数据库中的有用工具,但使用游标完成任务始终比使用面向集合的 SQL 语句花费多。
当使用面向集合的 SQL 语句时,客户端应用程序让服务器更新满足指定条件的记录集。服务器决定如何作为单个工作单元完成更新。当通过游标更新时,客户端应用程序要求服务器为每行维护行锁或版本信息,而这只是为了客户端在提取行后请求更新行。
而且,使用游标意味着服务器通常要在临时存储中维护客户端的状态信息,如用户在服务器上的当前行集。为众多客户端维护这类状态信息需消耗大量的服务器资源。对于关系数据库,更好的策略是让客户端应用程序快速进出,以便在各次调用之间不在服务器上维护客户端的状态信息。面向集合的 SQL 语句支持此策略。
然而,如果查询使用游标,请确定如果使用更高效的游标类型(如快速只进游标)或单个查询能否更高效地编写游标查询。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->使用高效数据检索优化应用程序性能
(8)使事务尽可能简短。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"事务和批处理对应用程序性能的影响"。
(9)使用存储过程。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"存储过程对应用程序性能的影响"。
(10)使用 Prepared Execution 来执行参数化 SQL 语句。
有关更多信息,请参见SQL SERVER联机丛书中对"Prepared Execution (ODBC)详细介绍"。
(11)始终处理完所有结果。
不要设计或使用在未取消查询时就停止处理结果行的应用程序。否则通常会导致阻塞和降低性能。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"了解和避免阻塞"。
(12)确保将应用程序设计为可避免死锁。
有关更多信息,请参见SQL SERVER联机丛书->访问和更改关系数据->锁定->在 SQL Server 中自定义锁定->死锁->"将死锁减至最少"。
(13)确保已设置所有能够优化分布式查询性能的适当选项。
有关更多信息,请参见SQL SERVER联机丛书->优化数据库性能->应用程序设计->"优化分布式查询"。
相关文章推荐
- 如何提高SQL SERVER的性能
- 如何提高SQL SERVER的性能
- 教你如何提高SQL Server 2000 的性能?
- 如何把SQL SERVER 2000性能提高?
- 如何提高SQL SERVER的性能 (1)
- 如何提高VS2010的性能,VS2010不再…
- 在HTML5中如何提高网站前端性能
- 用索引提高SQL Server性能
- 如何优化JAVA程序开发,提高JAVA性能?
- 四项技术提高SQL Server性能
- 如何清除临时文件,释放空间,提高计算机性能
- 如何利用AdaBoost提高分类性能
- [WM].NET CF下如何提高应用程序的性能 【转载】
- 如何提高网站的性能---方法1
- 如何提高单片机系统的抗干扰性能
- PreparedStatement是如何大幅度提高性能的
- 如何用JNI技术提高Java的性能详解
- Web前端性能优化——如何提高页面加载速度
- 数字电源管理如何提高蓝牙无线的性能?---凯利讯半导体
- 什么是反向代理,如何利用反向代理提高网站性能