SQL Server提供的约束类型分别为默认值约束、Check约束、唯一约束和外键约束。接下来详细介绍它们对性能的影响。
1.默认值约束
在新增数据时,若没有指定字段的值,则使用默认值约束中的定义自动填充数值。默认值约束只在新增数据时才会被调用,且它只会影响新增的行,对数据库引擎来说,它的影响几乎可以忽略不计。
2.Check约束
在新增或修改数据时,会先判断新值是否符合Check约束的定义,若不符合则返回相应的警告信息。Check约束可以指定一些较为复杂的表达式,在指定Check约束时,应使逻辑尽量简单。Check约束的引入,相当于告诉查询优化器:“这个字段的值只有某些枚举值”。例如,“性别”字段,其约束只允许字段值有“Male”和“Female”两种值,当查询语句通过这个字段查找“Male”或“Female”时,就直接返回空数据,而不再对数据进行大量的检索操作,因为约束告诉查询优化器,过滤的这两个值“Male”与“Female”是不存在的。
3.唯一约束
创建一个唯一约束会默认创建一个唯一索引,它在校验的过程中,是利用索引的树结构来检索的,在数据更新的时候会有一定的开销,不过这个开销非常小,也可以忽略。同时,唯一索引是筛选率非常高的一种索引结构,对于查询优化有极大的帮助。通常在一个表中,无论是无意义的自增值,还是有意义的业务字段,至少应该有一个唯一约束存在。
4.外键约束
外键约束为了保证主、子表数据的完整性,在子表进行增、删、改等操作的时候,会同时校验主表的数据是否完整。这个过程中,会对主表加锁进行查询,这时主表的关联字段一定是主键或唯一键,它的校验速度非常快,不会有太大的问题。当子表进行删除操作的时候,外键约束会去校验子表的关联字段是否存在。此时,如果子表的关联字段没有索引,将会扫描整个子表,那会使开销剧增(如果子表非常大)。所以在添加外键关联的时候,需要同时检查子表中的关联字段是否有索引,如果没有,请手工创建它(有部分网友误以为SQL Server会自动创建索引,其实是不会的)。在某些情况下,比如子表是日志表或历史表,对于数据完整性并没有要求,此时请不要在上面加外键约束,因为这只会给系统带来额外的消耗。