《SQL_Server开发通用规范》由会员分享,可在线阅读,更多相关《SQL_Server开发通用规范(21页珍藏版)》请在金锄头文库上搜索。
1、-SQL开发规文件编号:文件版次:文档编号版本号0.9分册名称sqlServer开发规第1册/共1册总页数正文附录编制启琳审批生效日期东软集团股份修改记录版本号变更控制报告编号更改条款及容更改人审批人更改日期0.92010001文档创立启琳2010-2-21.1 目的规sql的编写格式,提高SQL语句的可读性,共享性和执行效率。1.2 使用围 所有需要与数据库交互的应用系统。1.3 概述 大局部业务系统需要与数据库进展交互,与数据库交互的主要方式就是SQL语句,编写规的SQL语句不但利于阅读,而且被数据库重复使用的几率也较大,执行效率相对较高,编写的好的SQL与编写的差的SQL在执行性能上可能
2、会差几倍甚至几千几万倍,因此养成好的SQL编写规对于提高工程质量及提高开发人员自身素质有着潜在的极大的影响。1.4 书写 SQL书写遵守如下规:u 在同一个工程中,为了最大限度实现SQL的共享,要求书写sql语句时大小写要一致,为了阅读方便和统一起见,所有SQL语句全部小写如SQL谓词,字段名,表名等,常量除外,常量可以按需要书写。举例:下面两个一样的语句除常量外都要统一起来。1)select name from emp;2)select NAMEfrom emp where emp_no=QD001u SQL语句尽可能放在一行,假设SQL太长放在一行中影响阅读时可分多行,但要保持缩进一致,缩
3、进可用TAB或者空格,但TAB数和空格数最好一致。u SQL语句中,各谓词之间以空格分割的,尽量保持空格数量一致,即假设用一个空格分割,则全部都用一个空格分割,便于数据库能够共享。u 能使用绑定变量的,尽量使用绑定变量,尤其是在前台程序中.u 对下面列出的情况,慎重使用绑定变量:1) 列值倾斜严重,如:*一状态列大局部值是1,只有极少数值为2,这种情况不宜用绑定变量,而应该用常量,便于数据库使用柱状图统计信息。2) 日期时间列。总之:书写SQL的目标是假设sql的用途是一样的,则sql应该完全一致,包括空格,大小写。下面的语句由于写法不完全一样,数据库会理解为4条不同的语句从而导致重复编译,降
4、低了性能。1) select name from emp where emp_no=1112) Select name From emp Where emp_no=1113) select Name from EMP where emp_no=1114) select name from emp where EMP_NO=111 下面的语句,由于语句规,可以只编译一次。1) select name from emp where emp_no=1112) select name from emp where emp_no=2223) select name from emp where emp_
5、no=3334) select name from emp where emp_no=:b11.5 注释1.5.1 开头注释所有的过程、函数、触发器、包都应该在开头有注释,注释中要列出对象名称;完成功能简述;调用模块,调用时机;创立日期;作者信息;历次修改日期;历次修改人;历次修改原因和其它作者认为重要的容,在每次修改的注释之间建一空行。举例如下:/*名称:PRO_WO_MULTI_REPAIR_JOB功能:屡次维修判定程序调用:自动统计月结前,后台调用 *时间:2009-02-20修改人:*修改时间:2009-03-08修改容:重写局部SQL优化性能修改人: *修改日期:2008-03-23
6、修改容:增加判断条件*/1.5.2 块注释对于复杂的语句块,必须提供块注释,清晰描述该语句块的功能逻辑、数据构造以及算法;块注释应该和它们所描述的代码具有一样的缩进格式;块注释之首应该有一个空行,用于把块注释和代码分割开来;块注释构造如下所示:/*计算配送能力系数:派工系数 a*b+c*d+e*fa:考评成绩,取*的考评成绩c:承当度度,根据当前遗留量和总效劳能力计算所得,c=当前遗留配送量/总配送能力 .*/1.5.3 行注释对于复杂的SQL语句,必须提供行注释,清晰描述该SQL语句功能以及目的;行注释构造如下所示:-计算动态能力得分,当负荷率超高时,可能出现负值,注意处理。添加注释时要注意
7、:注释中包含 GO 命令时会生成一个错误消息。1.5.4 过程和函数1.5.5 命名规存储过程/函数的命名代码使用以下方式:存储过程名 = SP_ + 模块代码 + 存储过程代码函数名 = F_ + 模块代码 + 函数代码存储过程以表现其功能的简洁语言进展命名,定义好后,放置于每一个Diagram的特定区域一般置于右边局部的上边。1.5.6 过程/函数头定义规包括过程/函数名称定义、参数定义、注释说明、变量定义四局部。u 参数定义所有的参数必须显示指出变量类型,对于返回参数,必须指出其方向;参数变量定义格式为:“a“+参数类型简写“_参数名称,其中a是单词argument(参数)的第一个字母,
8、参数类型如下:文本型:s日期时间型:d数字型:n整形:i布尔型:b举例:as_name 标识文本型 ad_birthdate 表示日期时间型 an_age 表示数字型u 注释说明见前面描述。1.5.7 变量定义规(1).变量的命名除游标变量以外,所有的变量命名采用此方式:变量名 = “v_ + 变量名称游标变量采用:变量名 = “cur + 变量名(第一个字母大写)。其中变量名称由代表变量确切含意的单词代码组合而成,每一个单词的首字母根据阅读的方便性决定是否需要大写。举例:变量名:v_EmpName游标名:curNetlist(2).变量类型定义变量的类型时,尽量采用显示定义的方式。对于仅用于
9、Oracle系列的数据库应用,也可以引用表、游标的引用定义方式。尽量将变量的定义分开来,并进展格式化,以便程序代码的阅读。例如: v_UserName CHAR(10) v_SE* CHAR(1)1.5.8 变量注释原则上要求对于一般变量定义时必须加上注释,如变量有特定的值围,则必须显示描述各确切值及其含意说明;1.5.9 过程/函数体定义规在过程/函数的定义中,最重要的是过程代码的严谨性和可读性,主要包括以下的考前须知:(1).如无特殊需要,SQL中涉及的所有容都要小写。(2).原则上要求所有的SQL语句必须在其前面加上注释,对于IF/CASE等流程控制语句,必须在语句前/后说明控制处理和可
10、能的流程方向;(3).所有的赋值语句要求变量与运算符之间要有空格。如:v_Count := v_Count + 1,并保持适当的对齐;(4).尽量防止复杂SQL,尤其是关联多个大表的SQL,对于需要关联多个大表的SQL最好分解成小的SQL分步处理,防止出现性能问题,对于复杂的语句块之间,要求中间参加空行;(5).所有可能的返回结果,必须在过程体中显示定义和说明,并在注释中说明。在其它的过程、代码中调用本过程/函数时,必须在其代码中处理所有的各种可能的返回结果;(6).锁定数据时,尽可能只锁定要操作的数据行,防止锁定整个表,限制使用local table等DDL语句,假设要对数据表、数据行加锁时
11、,需要考虑由此导致的并发操作失败的处理;(7).所有的过程/函数代码在编写之前,必须要有设计原型及其说明;u 存储过程/函数错误定义(1).所有的DML语句必须考虑死锁、并发、主关键字不唯一等的出错异常处理,应该对所有可能出现的异常进展捕获、编码处理,并注明异常的容注:异常捕获及处理请参见1.2;(2).异常处理有两种需要考虑的问题,一是事务的完整性;二是错误的出错日志及返回处理。所有异常的根据其类型和等级进展以下的处理:类型容处理系统级数据库级发出的底层的异常,如主关键字不唯一冲突等;返回定义错误代码为其它错误,完全回退事务,登录异常日志;应用级应用系统定义并发出的异常,如指定记录不存在;定
12、义应用级错误代码,根据实际情况处理事务;u 使用原则(1).存储过程功能尽量保持独立、复用,但尽量防止嵌套调用,充分考虑其性能表达;(2).使用前台代码调用存储过程时,必须考虑返回传入参数的有效性、代码的处理及展示、事务完整性处理;(3).直接使用参数作为变量处理,不要在存储过程中定义参数同样含义的变量使用,防止由于值的不同导致性能问题。1.6 触发器1.6.1 命名规:触发器不同类型的命名构造如下操作时机命名构造InsertAfterai_表名UpdateAfterau_表名DeleteAfterad_表名1.6.2 触发器编写规请参见存储过程/函数编写规。1.7 异常所有过程和函数处理必须
13、考虑可能出现的错误,一是数据库或操作系统底层错误;二是由于业务逻辑造成的错误;三是无反响或超时;四是输入参数不在指定围。设计所有的过程时,必须考虑出错后的恢复。1.8 优化1.8.1 SQL语句原则l Where子句尽量防止使用函数;l 防止在ORDER BY子句中使用表达式;l 限制在GROUP BY子句中使用表达式;l 慎用游标;l 大小写规统一,变量绑定统一,防止重复编译;l 尽可能少的返回结果集行的数量l 防止使用select * 语句;l 减少结果集中的列的数量;l 视图嵌套使用不能超过3层;l 不要使用没有意义的列作为聚集索引列,例如,加1自增列;l 防止隐式类型转换,例如字符型一定要用,数字型一定不要使用;l 查询语句一定要有围的限定,防止全表扫描操作;l 合理对大表进展分区;l 慎用DISTINCT关键字;l 慎用UNION关键字,可以用OR替代;l 使用top 1替count(*)来判断是否存在记录;1.8.2 索引创立原则l 同一索引中的组成列最好不要超过3列。l 把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面。l 根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、