数据库代码编写规范

来源:互联网 发布:php开源erp系统 编辑:程序博客网 时间:2024/05/20 10:14

1.除非影响业务,读取表(select)时,请使用WITH(NOLOCK),以提高并发性;

2.除了exists语句外,不要使用SELECT *,必须指明列名;

3.多表链接时,取有意义的表别名,并在每列前加表别名(如:a.id,b.name....),不要偷懒,防止对表增改列而造成列名冲突。同时可增强可读性;

4.使用表,存储过程,函数等资源时,必须指明架构(scheme).如:“dbo.property”;

5.不要对条件列使用函数(如:datediff(dd,createAt,getdate())),函数运算会导致索引失效;

6.除非必要,不使用OR或NOT IN ,NOT LIKE,<>之类的负逻辑;

7.查询条件中,特别是负逻辑,对于允许为空(nullable)的列必须有ISNULL,IS NULL或IS NOT NULL的判断逻辑;

8.查询条件(WHERE)尽量使用索引查找,尽可能缩小返回的数据集范围;

9.如果返回的结果集过大(典型参数下,结果集超过50条),需进行分页;

10.除非必要,不要使用显式事物(BEGIN TRAN),包括程序框架封装的事物,即使使用事物,也要保证事物尽可能的短;

11.SELECT,UPDATE,DELETE时,查询条件中变量数据类型与表列数据类型一致;表连接join时,连接条件的数据类型应一致;

数据库中数据类型是严格的,不匹配就会有数据类型转换,如果这个导致的转换最终是在大量的数据行上,那会产生极大的性能影响。注意条件和JOIN中的数据类型转换。尽可能使用显示的数据类型转换,并将转换的目标常量/定量/参数或者数据量少的一方。

特别的,在JOIN中String类型的参数到数据库中默认就映射为NVARCHAR(4000),如果对应表的字段类型是varchar或char等非unicode的字符类型,在SQL2005及以前版本将会完全用不上索引,在SQL2008版本中的索引效率也非常低。JDBC配置中加上sendStringParametersAsUnicode=false;

12.申明临时表和表变量时,字段的数据类型应尽量小,以节省资源;通常情况下,请使用有主键的表变量;

13.必须才存储过程(sp)头部添加“change log”,说明修改意图,并在修改处加以标识;

14.如果引用了链接服务器,或者使用了跨数据库的资源,需要在sp头部说明;

15.尽可能不实用触发器,尽量在程序中实现相应逻辑;

16.除非无替代方案,不要使用游标;

17.尽量避免在数据库中使用模块化的设计思想,避免多层嵌套视图

查询涉及的每隔视图可能很简单,但层层嵌套组合起来,可能最终形成一个复杂查询;

18.如果设计到分区表,则一定要有分区列的条件,且数据类型必须匹配;

19.除非影响业务,应在存储过程中设置相应的开关

a)SET NOCOUNT ON

当SET NOCOUNT为ON时,不返回计数。当SET NOCOUNT为OFF时,返回计数。当设置SET NOCOUNT为ON时,将不向客户端发送存储过程中每个语句的DONE_IN_PROC消息,如果存储过程中包含一些并不返回许多实际数据的语句,网络通信流量便会大量减少,因此,将SET NOCOUNT设置为ON可显著提高性能。

b)SET XACT_ABORT ON(视实际业务需要,不做硬性要求)

当SET XACT_ABORT为ON时,如果执行Transact-SQL语句产生运行时错误,则整个事物将终止并回滚。

0 0
原创粉丝点击