SQLServer常用规范

字段类型

  • 字符类型 varchar/nvarchar

  • 金额货币 money

  • 科学计数 numeric

  • 自增主键 bigint

  • 时间类型 datetime

  • 禁用老旧 text/ntext/image

  • 禁用类型 xml/varchar(max)/nvarchar(max)

约束

  • 每张表必须有且仅有一个自增主键,主键不为空且唯一。

  • 外键增加了表结构变更及数据迁移的复杂性

  • 外键对插入、更新的性能有影响,需要检查主外键约束。

  • 数据完整性应由程序控制

  • 新表禁用NULL,空值增加应用程序的复杂性,必须增加特定的判断逻辑。

  • ISNULL会引起引起严重的性能瓶颈

索引

  • 应对WHERE子句中经常使用的列创建索引

  • 应对经常用于连接表的列创建索引

  • 应对ORDER BY子句经常使用的列创建索引

  • 不应该对小型表创建索引,因为完全表扫描操作可能比使用索引执行的查询快。

  • 单表索引不得超过6个
    索引加快了查询速度,却影响了写入性能。一个表的索引应该结合表相关的SQL综合创建,尽量合并。组合索引的原则是过滤性越好的字段越靠前。索引过多不仅会增加编译时间,也会影响数据库选择最佳执行计划。

  • 不要给选择性低的字段建立单列索引
    SQL Server对索引字段的选择性有要求,如果选择性太低SQL Server会放弃使用。不适合创建索引的字段如:性别、0/1、TRUE/FALSE。适合创建索引的字段如:ID相关的字段。

  • 充分利用唯一约束
    唯一索引给SQL Server提供了确保某列绝对没有重复值的信息,但查询分析器经过唯一索引查找到一条记录时,会立刻推出不会继续查找索引。

  • 索引包含的字段不超过5个

查询

  • 禁止在数据库做复杂运算
    例如XML解析、字符串相识性比较、字符串搜索CHARINDEX,复杂运算因在程序端完成。

  • 禁止使用SELECT *
    禁用后可减少内存消耗和网络带宽,给查询优化器有机会从索引读取所需的列,表结构变化时容易引起查询出错。

  • 禁止在索引列上使用函数或计算
    在WHERE子句中,如果索引是函数的一部分,优化器将不再使用索引而使用全表扫描。

  • 禁止使用游标和触发器
    关系数据库适合集合操作,也就是由WHERE子句和选择列确定的结果集作为集合操作,游标提供了一个非集合操作的途径。一般情况下,游标实现的功能往往相当于客户端的一个循环实现的功能。游标把结果集放在服务器内存,并通过循环一条一条处理记录,对数据库资源,特别是内存和锁资源消耗非常大。而触发器对引用不透明。

  • 禁止在查询里指定索引
    随着数据的变化查询语句指定的索引性能可能并不是最佳的。索引对引用是透明的,例如指定的索引被删除将会导致查询报错不利于排障。新建的索引无法被引用立即使用,必须通过发布代码才能生效。

  • 变量、参数、关联字段类型必须和字段类型一致
    避免类型转换额外消耗的CPU,引起的大表扫描尤为严重。

  • 参数化查询

  • 限制JOIN个数
    单个SQL语句的表JOIN的个数不能超过5个,过多的JOIN个数会导致查询分析器走错执行计划。过多JOIN在编译执行时消耗很大。

  • 限制SQL语句长度及IN个数
    在IN子句中包括数量非常多的值,可能会消耗资源,并返回错误8623或8632,要求IN中条件个数限制在100个以内。

  • 尽量避免大事务操作
    只在数据需要更新时开始事务,减少资源锁持有时间。增加事务异常捕获预处理机制。禁止使用数据库上的分布式事务。

  • 关闭影响的行计数信息返回

  • 除非必要SELECT语句都必须加上NOLOCK

  • 使用UNION ALL替换UNION

  • 查询大量数据使用分页或TOP

  • 递归查询层级限制

  • NOT EXISTS替代NOT IN

  • 临时表与表变量

  • 使用本地变量选择中庸执行计划

  • 尽量避免使用OR运算符

  • 增加事务异常处理机制

  • 输出列使用二段式命名格式

你可能感兴趣的:(SQLServer常用规范)