sqlserver 学习日志----sqlserver 优化学习日志:
2009-01-08 12:49
232 查看
1.08 sqlserver 优化学习日志:
1) 存储过程的编译及写作:
当一个存储过程第一次被执行时,它会被优化,一个查询计划被编译并缓存在SQL Server内存中。如果相同的存储过程被再次调用,它将不会在创建一个新查询计划,而是使用缓存的计划,这会节省时间、提高性能。这可能并非一直都是你所希望的。如果存储过程中的该查询每次都完全相同,那么这是一件好事。但是如果查询是动态的(例如WHERE子句可能会有所不同),那么这将非常糟糕,因为查询运行时不会再给优化,该查询的性能可能会受影响。如果你知道存储过程中的查询每次运行时会有所不同,那么在你创建存储过程时,你可以考虑增加WITH RECOMPILE选项。这将会强制存储过程每次运行时需要重新编译。
记住在你的存储过程中增加“SET NOCOUNT ON”这个声明。如果你没有打开这个功能,那么每次一个SQL语句被执行是,SQL Server将会发送一个响应给客户端,显示该语句所影响的行数。实际上客户端一般不需要这个信息。使用这个声明可以有助于减少服务器和客户端之间的通信。
为避免在你的SQL Server应用程序中发生死锁现象,按照以下建议来设计你的应用程序:1、应用程序每次按照相同的顺序来访问服务器对象;2、在事务处理过程中,不允许任何用户输入。在事务处理开始前对其进行收集;3、保持事务处理简短且在一个单一批处理中。
2) 索引设计:
索引过多所带来的问题是,每次一条记录被插入、删除或更新操作时,SQL Server必须对索引进行维护。维护1、2个索引或许不会给SQL Server带来太大开销,但是如果你的索引在5个以上,这可能会给数据表带来较大的性能负担。理想情况下,索引应该越少越好。为了获得最优化性能,选择合适的索引数需要你掌握好一个平衡的度。
大概来说,只有你确信真正需要添加索引的时候,才对表添加索引。你必须非常了解对数据所进行的查询类型,然后根据这些信息选择合适的索引,索引创建后,必须通过测试来查看它是否真正可以提高性能。
对于OLTP应用来说,选择最佳索引通常比较困难,因为这类应用通常要进行大量的插入、更新和删除行为。尽管你需要好的索引来迅速定为那些需要进行插入、更新或删除操作的记录,但是如果索引太多,会使得每一次操作带来太大的开销。另一方面,如果你有一个仅对数据库进行只读操作的OLAP应用,那么你可以根据自己的需要来尽可能多的添加索引。由此可见,你的应用程序使用方式不同,会给你的索引建立策略带来很大差别。
还有两种情况,索引不会给你的SQL Server带来性能上的提高,一是数据表非常小、记录非常少的情况下;二是被索引的列有超过95%以上的数值不是唯一的。这两种情况下SQL Server查询优化器不会使用你选择的索引,因此它们对SQL Server是一个负担,需要删除之。
1) 存储过程的编译及写作:
当一个存储过程第一次被执行时,它会被优化,一个查询计划被编译并缓存在SQL Server内存中。如果相同的存储过程被再次调用,它将不会在创建一个新查询计划,而是使用缓存的计划,这会节省时间、提高性能。这可能并非一直都是你所希望的。如果存储过程中的该查询每次都完全相同,那么这是一件好事。但是如果查询是动态的(例如WHERE子句可能会有所不同),那么这将非常糟糕,因为查询运行时不会再给优化,该查询的性能可能会受影响。如果你知道存储过程中的查询每次运行时会有所不同,那么在你创建存储过程时,你可以考虑增加WITH RECOMPILE选项。这将会强制存储过程每次运行时需要重新编译。
记住在你的存储过程中增加“SET NOCOUNT ON”这个声明。如果你没有打开这个功能,那么每次一个SQL语句被执行是,SQL Server将会发送一个响应给客户端,显示该语句所影响的行数。实际上客户端一般不需要这个信息。使用这个声明可以有助于减少服务器和客户端之间的通信。
为避免在你的SQL Server应用程序中发生死锁现象,按照以下建议来设计你的应用程序:1、应用程序每次按照相同的顺序来访问服务器对象;2、在事务处理过程中,不允许任何用户输入。在事务处理开始前对其进行收集;3、保持事务处理简短且在一个单一批处理中。
2) 索引设计:
索引过多所带来的问题是,每次一条记录被插入、删除或更新操作时,SQL Server必须对索引进行维护。维护1、2个索引或许不会给SQL Server带来太大开销,但是如果你的索引在5个以上,这可能会给数据表带来较大的性能负担。理想情况下,索引应该越少越好。为了获得最优化性能,选择合适的索引数需要你掌握好一个平衡的度。
大概来说,只有你确信真正需要添加索引的时候,才对表添加索引。你必须非常了解对数据所进行的查询类型,然后根据这些信息选择合适的索引,索引创建后,必须通过测试来查看它是否真正可以提高性能。
对于OLTP应用来说,选择最佳索引通常比较困难,因为这类应用通常要进行大量的插入、更新和删除行为。尽管你需要好的索引来迅速定为那些需要进行插入、更新或删除操作的记录,但是如果索引太多,会使得每一次操作带来太大的开销。另一方面,如果你有一个仅对数据库进行只读操作的OLAP应用,那么你可以根据自己的需要来尽可能多的添加索引。由此可见,你的应用程序使用方式不同,会给你的索引建立策略带来很大差别。
还有两种情况,索引不会给你的SQL Server带来性能上的提高,一是数据表非常小、记录非常少的情况下;二是被索引的列有超过95%以上的数值不是唯一的。这两种情况下SQL Server查询优化器不会使用你选择的索引,因此它们对SQL Server是一个负担,需要删除之。
相关文章推荐
- 我的编程学习日志(2)--进制转换的优化
- 我的编程学习日志(2)--进制转换的优化
- 深入浅出MySQL开发优化和管理维护学习笔记之MySQL日志文件
- 学习日志---hbase优化总结
- asp.net MVC日志插件Log4Net学习笔记二:保存日志到sqlserver的配置
- sqlserver 事务日志文件格式
- 日志学习log4j
- JQuery学习日志2
- Android学习记录之------R文件的优化
- swift学习日志—— 属性
- hadoop学习-海量日志分析(提取KPI指标)
- MySQL学习笔记(一)Ubuntu16.04中MySQL安装配置(5.6优化、错误日志、DNS解决)
- cocos2d-x学习日志(1)--视角跟随主角
- 《视觉SLAM十四讲》学习日志(一)——预备知识
- sqlserver优化小结【转】
- Objective -C语言基础学习日志(五)
- 学习日志一(2009年8月5日)pop服务安装
- C#和sqlserver数字数据类型学习
- 黑马程序员-学习日志-RandomAccessFile
- CUDA 学习(十八)、优化策略3:传输