维护建议--开发设计
--========================================================
以下是一些开发实际相关的建议,敬请拍砖
--========================================================
1. 使用统一的命名规范
命名规范是保证代码风格一致,提高代码可读性。
2. 避免使用SQL SERVER关键词
使用关键词作为表名/列名/别名降低代码可读性,并导致在将来的版本升级中可能出现风险。
3. 在查询时,使用[架构].[对象名]来访问对象,对表和视图以及表值函数指定别名,使用[别名].[列名]来访问数据列
在对象没有指定架构情况下,SQL SERVER 需要依据当前用户默认架构及相关权限来查找对象所属架构,当多个架构下存在同名对象时,未指名架构可能会引发逻辑错误。而对于未标明所属对象的列名,SQL SERVER遍历所有查询中使用到的对象来查找匹配的对象。使用[架构].[对象名]和[别名].[列名]不仅提高了代码可读性,还有效减少查询的编译时间。
4. 避免使用sp_作为存储过程前缀,以避免查找系统对象和潜在问题
对于使用sp_作为前缀存储过程,查询优化器会优先在系统存储过程中查找,因此不建议使用sp_作为前缀
5. 避免返回无用数据列和无用的数据行。
无用的数据列和数据行会照成不必须要的查询消耗和网络消耗。
6. 使用自定义函数或子查询时,考虑执行次数和性能消耗。
错误使用自定义函数或子查询会导致极差的性能,因此需要考虑自定义函数或子查询执行次数以及每次调用的消耗。
7. 对于复杂查询,使用临时表或表变量来缓存结果集
在生成执行计划过程中,执行优化器需要分析各种可能的执行方案,随着查询复杂程度的增大,执行方案的数量将会几何级增长,并且很难准确预估每个步骤的影响行数并生成高质量的查询(尤其对于聚合操作生成的中间结果集),将复杂查询拆分成多条语句,并使用临时表或表变量来缓存中间结果集,可能会对性能有显著提升。
8. 使用查询参数化
查询参数化有利于执行计划重用,减少编译,从而降低CPU消耗。
9. 对分布不均匀数据查询特殊处理
在数据分布不均匀情况下,应该数据分布的具体情况使用不同的查询语句,或不使用查询参数化,以避免使用相同执行计划导致的性能问题。
10. 考虑查询是否需要DISTINCT和ORDER BY等操作符
部分开发人员由于对业务或数据不了解,滥用DISTINCT和ORDER BY等操作符,造成CPU资源浪费和性能问题
11. 使用合适的数据类型来定义表,使用合适的数据类型来避免查询中发生隐式转换
表定义时使用不合适的数据类型(如时间存放成字符串),会导致如磁盘空间浪费/数据被截断/数据处理复杂等各种问题;而在查询时使用不合适的数据类型,可能导致查询中发生隐式转换,当隐式转换发生在数据列上时,会导致无法使用索引(或无法正确使用索引)。
12. 合理使用范式化和反范式化
在系统开发阶段使用范式化来防止数据操作异常(更新异常/插入异常/删除异常),在系统优化阶段使用反范式化来提升性能。
13. 分析数据访问频率
当表中不同列的访问频率不同时,考虑将更新频率的数据列拆分到其他表中,考虑将更新频率较低且占用空间较大的数据列拆分到其他表中。
--===================================================
相关参考
关键词列表
http://msdn.microsoft.com/zh-cn/library/ms189822(v=sql.120).aspx
T-SQL编写建议
http://www.cnblogs.com/CareySon/archive/2012/10/11/2719598.html
拆分复杂查询
http://blogs.msdn.com/b/sqlcat/archive/2013/09/09/when-to-break-down-complex-queries.aspx
隐式转换
http://www.cnblogs.com/TeyGao/p/3620846.html
--======================================================