现在的位置: 首页 > 综合 > 正文

sql server数据库编程指导以及最佳实践

2013年10月27日 ⁄ 综合 ⁄ 共 1848字 ⁄ 字号 评论关闭

原则

编写高可读的代码:遵循命名原则和代码风格约定
开始就要关注t-sql代码性能的影响:减少网络流量,减少磁盘IO,利用索引,避免lock
编写安全的代码

------------------------------------------------------------------------------

命名数据库对象时,采用统一的前缀或者后缀

采用统一的前缀或者后缀是为了提高代码的可读性,但是
存储过程不要使用sp_作为前缀,函数不要使用fn_作为前缀。
如果sql server发现存储过程以sp_作为前缀,都会先到master数据库中查询这个存储过程

添加必要的注释

存储过程或者函数,视图前应该注释创建者, 创建时间,修改者,修改时间,功能注释,使用说明,同时包含一到多条执行该对象的语句

及时检查执行状况

默认情况下,如果一条sql语句执行错误,sql server不会自动roll back前面的执行(可以设置:SET XACT_ABORT ON),sql语句执行完毕后,需要及时通过全局变量@@error和@@rowcount来检查执行状况。

用标准的join方式

标准的join方式是指while语句中只包含过滤条件,不包含join条件

尽量避免客户端程序直接通过select,insert,update等直接操作数据库

用存储过程封装数据访问,存储过程是经过编译的,不用每次计算execute plan。而且封装了逻辑,同时增加了安全性。

存储过程如果需要返回数据,使用output关键字

不要用return返回数据,存储过程的return应该返回存储过程的执行状况,如果需要返回数据,使用带有output关键字的参数

谨慎使用IDENTITY作为表的主键的数据类型

IDENTITY会给客户端程序和database交互带来很多影响,而且在数据导入导出时也会带来麻烦,需要仔细评估这些影响。但是IDENTITY和guid相比也有优点,就是可读性。

尽量避免使用NULL

如果没有特别设置,null参与的运算结果都为null,如果疏忽这一原则,会对程序逻辑的正确性带来影响,而且,客户端程序需要额外的步骤来处理NULL。需要设置ANSI_NULLS为ON。

在insert语句中,使用确定的列名

insert语句中,使用确定的列名以间少表结构变化对t-sql代码带来的影响

尽量使用外键,约束检查来保证数据的完整性

数据完整性至关重要,外键,约束检查可以避免另外写代码来保证数据完整性

不要在查询时用select * ,用确定的列名来代替 *

查询结果中冗余的信息影响整体的性能

尽量避免使用服务器端游标

服务器端游标对性能有严重的影响,应当尽量避免,比如可以用while循环来代替游标,如果不能避免,则应选择最合适的游标类型

尽量避免使用临时表

临时表会发生磁盘IO操作,影响性能,可以用嵌套查询,view,或者table变量来代替临时表。如果需要缓存大量的数据,临时表优于table变量,同时注意为临时表建index

如果需要执行一系列sql命令,在前面添加SET NOCOUNT ON

执行SET NOCOUNT ON,sql命令执行影响的行数不会传回客户端,减少网络流量,提高性能

在字符串匹配查询时,避免在第一个字符位置使用通配符

如果第一个字符位置使用通配符,则index不起作用

避免使用IN 或者NOT IN

使用IN 或者NOT IN,则index不起作用

事务处理时,尽可能的占用最少的资源

事务处理时,尽可能的占用最少的资源以减少资源的锁定,提高数据库整体性能。同时检查加锁类型,尽量使用低级别的加锁类型。

匹配的事务处理

如果存储过程开始了事务处理,应该负责结束这个事物处理,submit或者rollback

操作NCHAR或者NVARCHAR数据类型的列时,使用N关键字

使用N关键字,sql server会使用unicode编码,避免出现乱码

尽量避免使用TEXT,NTEXT,binary,image数据类型的字段,尽量避免将文件或者图片直接存入数据库
 
这些数据类型访问方式不同于普通的数据类型。数据库也不是存储文件或者图片内容合适的地方

尽量使用VARCHAR代替CHAR,用NVARCHAR代替VARCHAR,

用VARCHAR代替CHAR是为了节省数据库空间,NVARCHAR代替VARCHAR是为了避免unicode带来的麻烦

如果某个table中的数据对不同用户的可见性是不一样的,使用view来隔离用户对table的直接访问

检查sql注入式攻击对代码的影响。

【上篇】
【下篇】

抱歉!评论已关闭.