MSSQL数据库设计规则(2)

 

1 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留字大写。
2
连接符orinand、以及=、<=>=等前后加上一个空格。
3
对较为复杂的sql语句加上注释,说明算法、功能。
注释风格:注释单独成行、放在语句前面。
(1)
应对不易理解的分支条件表达式加注释;
(2)
对重要的计算应说明其功能;
(3)
过长的函数实现,应将其语句按实现的功能分段加以概括性说明;
(4)
每条SQL语句均应有注释说明(表名、字段名)。
(5)
常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)
(6)
可采用单行/多行注释。(-- /* */ 方式)
4
SQL语句的缩进风格
(1)
一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进
(2) where
子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
5
多表连接时,使用表的别名来引用列。
6
供别的文件或函数调用的函数,绝不应使用全局变量交换数据;
7
变量令名不能超出ORACLE的限制(30个字符),令名要规范,要用英文令名,从变量上能看到变量的作用,如
g
名称 全局变量
m
名称 局部变量
c
名称 光标
p
名称 参数
8
查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。要清楚明白地使用列名,而不能使用列的序号。
9
功能相似的过程和函数,尽量写到同一个包中,加强管理。

如例(1

二、 书写优化性能建议
1
、避免嵌套连接。例如:A = B and B = C and C = D
2
where条件中尽量减少使用常量比较,改用主机变量
3
、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。
4
、大量的排序操作影响系统性能,所以尽量减少order bygroup by排序操作。

如必须使用排序操作,请遵循如下规则:
(1)
排序尽量建立在有索引的列上。
(2)
如结果集不需唯一,使用union all代替union
5
、索引的使用。
(1)
尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。
(2)
尽量注意比较值与索引列数据类型的一致性。
(3)
对于复合索引,SQL语句必须使用主索引列
(4)
索引中,尽量避免使用NULL
(5)
对于索引的比较,尽量避免使用NOT=!=
(6)
查询列和排序列与索引列次序保持一致

6
、尽量避免相同语句由于书写格式的不同,而导致多次语法分析,尽量使用Bind变量。
7
、尽量使用共享的SQL语句。
8
、查询的Where过滤原则,应使过滤记录数最多的条件放在最前面。
9
、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
10
inor子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

三、其他经验性规则
1
、尽量少用嵌套查询。如必须,请用not exist代替not in子句。如例(2
2
、用多表连接代替EXISTS子句。如例(3
3
、少用DISTINCT,用EXISTS代替 如例(4
4
、使用UNION ALLMINUSINTERSECT提高性能
5
、使用ROWID提高检索速度。对Select得到的单行记录,需进行DeleteUpdate操作时,使用ROWID将会使效率大大提高。
6
、使用优化线索机制进行访问路径控制。
7
、使用cursor时,显示光标优于隐式光标

本规范示例:
例一:
Select aka042 --
单位缴费划入个人帐户比例
INTO prm_aaa043
FROM ka01 --
医疗保险单位缴费划入个人帐户比例分段信息
Where akc021 = rec_kc01.akc021 --
医疗人员类别
AND aka041 >= rec_kc01.akc023 --
年龄上限
AND aka040 <= rec_kc01.akc023 --
年龄下限
AND aae030 <= prm_date --
开始时间
AND ( aae031 >= prm_date or aae031 IS NULL ); --
终止时间

例二:
X Select ......
FROM emp
Where dept_no NOT IN ( Select dept_no
FROM dept
Where dept_cat='A');

O Select ......
FROM emp e
Where NOT EXISTS ( Select 'X'
FROM dept
Where dept_no=e.dept_no
AND dept_cat='A');

例三:
X Select ......
FROM emp
Where EXISTS ( Select 'X'
FROM dept
Where dept_no=e.dept_no
AND dept_cat='A');

O Select ......
FROM emp e,dept d
Where e.dept_no=d.dept_no
AND dept_cat='A';

例四:
X Select DISTINCT d.dept_code,d.dept_name
FROM dept d ,emp e
Where e.dept_code=d.dept_code;

O Select dept_code,dept_name
FROM dept d
Where EXISTS ( Select 'X'
FROM emp e
Where e.dept_code=d.dept_code);


注释范例
过程注释:
过程都以sp_开头,注意过程名称要符合令名要求
/**************************************************************************
name:sp_Write_log
parameter:p_textContext in varchar2
参数描述
create date: 2003-04-1
creater:chen jiping
desc:
过程总功能描述
****************************************************************************/
函数注释
函数以f开头,令名符合令名标准
/**************************************************************************
name:f_Get_JobId
parameter:p_Name in varchar2
参数描述
return number:
返回值描述
create date: 2003-04-1
creater:chen jiping
desc:
函数总功能描述
****************************************************************************/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值