SQLSERVER 数据库使用规范_第2页
作者:[51ak ]
4. 函数的使用
a) 自定义函数可以少用,较多的考虑使用WEB层面处理相应逻辑
b) 函数的命名规则: ufn_开头
5. 事务的使用
a) 对数据一致性要求不高的业务,尽可能少的使用事务
b) 查询时如果可以尽可能多的使用 WITH NO LOCK
c) 使用事务时,对表的访问顺序在不同的程序中要尽可能的保持一致
d) 事务的粒度尽可能的小,长的事务要尽可能的拆分成多个
e) 事务中需要用到的一些变量和查询结果,应尽可能的在事务开始之前准备好
f) 事务中如果使用到大表(200万)需要优先考虑拆表或分区表
6. 链接服务器的使用
a) 不建议对异机房的数据进行大量的查询,替代方案是对指定表的复制订阅
b) 同机房的链接服务器不允许使用外网IP地址
c) 使用链接服务器时,需要考虑到对方服务器变更IP地址时带来的影响
d) 原则上不允许更新远程链接服务器的数据,改为在远程服务器上读这边的数据实现更新
7. 数据库作业的命名
分类名(普通,DBA维护,多库,多主机)_数据库名_作业用途的中文说明和运行频率_负责人_4位标识码
a) 分类名 可以写多个 例: 多库多主机_[DBA_PFData]_灾备机上统计各从属服务器上的日志延时_张文精_0000
b) 数据库名字段的说明
i. 多库的作业可以用逗号隔开,不要求所有库名都写上,写不全的以… 结尾
c) 标识码说明
i. 第一位标识码用来标识失败以后是否发送通知:0 不发送 1 发送邮件 2发送短信 3邮件+短信
ii. 第二位标识码用来标识作业的事务级别:
1. 0 可随时停止
2. 2 可终止,中止后需要重新手工启动该作业
3. 5 中止需要负责人确认,否则会产生数据混乱。(紧急情况下,DBA依旧有权在不通知的情况下中止作业)
4. 8 不可中止,中止必须负责人确认(请慎用,确认过程产生的时间和其他意外都将由该作业负责人承担)
iii. 第三位标识码 预留
iv. 第四位标识码 预留
8. 数据库作业的编写规范
a) 作业的业务逻辑应尽可能的写在存储过程中,而不是用大量的SQL语句写到步骤中
b) 作业的执行时间
i. 不允许在上班时间运行和启动有危险操作的SQL作业(包括:长时间锁表,大量资源占用,TRUNCATE表,修改线上表结构)
ii. 尽可能的避免每个整点的前后5分钟内(因为多数的作业会在此时间段运行,避免产生性能冲突)
iii. 尽可能的避免每天23:40-2:40这个时间段(几乎所有备份作业在此时间段运行)
iv. 尽可能的避免周末 6:00-8:00 运行作业(系统打补丁升级的会在此时间段运行)
v. 大量 insert,UPDATE,DELETE 的作业建议在 4:00-6:00 运行
9. Join(多表联合)查询
a) 不过分迷信3NF,4NF..范式设计,在一些可预计的查询瓶颈处考虑反范式
b) 将各子查询先筛选出小范围的行以后再JOIN
c) Join的参与表数量应尽可能的少,最多不能大于7个
d) 可以考虑将一部分常用的JOIN固化成物理视图再使用
e) 注意联合字段的索引(原则上用与ON的字段必须有索引)
10. 一些约定的书写规范
a) 任何地方不能出现 SELECT * FROM,所有查询强制写列名
b) 任何时间使用表名,存储过程名,都需要加上架构名( dbo.)
c) 任何用户创建的对象都是属于DBO架构,如有特殊情况,需要邮件知会
d) 原则上禁止游标的使用,可替代的方案分别是表变量和临时表
e) 原则上不能在SQL语句中使用强制索引(强制索引只允许出现在存储过程中,且需要邮件告知DBA)
f) 尽可能少的在列上使用表达式(或函数),会被放弃使用索引(最常见的是对时间字段的处理,请不要对表字段进行函数运算)
11. 有助于提高性能的一些SQL语句书写规范
a) 将SQL语句写在存储过程中,而不是SQL语句中
b) Select count(1)… >0 的效率要低于 IF EXISTS子句
c) 注意UNion和Union all 的区别
d) 不做无用的ORDER BY ,排序时还要考虑排序字段的索引
e) IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况
f) 不建议触发器的使用,可替代的方案包括CDC和程序处理
g) 如果有复杂的字符串处理(如正则匹配)可以考虑使用CLR函数