唯一约束 vs 唯一索引

46

我对学习开发人员在SQL Server中强制实现唯一性的技术有兴趣:UNIQUE CONSTRAINT还是UNIQUE INDEX。考虑到两者的物理实现几乎没有区别,您如何决定哪种方法最好?

除了性能之外还有什么原因来评估最佳解决方案吗?

其中一个优于另一个的数据库管理优势吗?

4个回答

33

他们没有显著的不同。当您创建唯一约束时,SQL Server会自动为您创建唯一索引。

通过创建索引的语法,您可以更好地控制定义唯一索引以指定聚集/非聚集、包含的列、文件组、索引过滤(SqlSvr2008)等。

在大多数情况下,约束是首选,因为它表达了独特性的意图:它是一个约束。索引无法传达这种意图。

至于可管理性,影响很小。您可以像独立创建索引一样管理索引(重建、重新组织)。唯一的区别是约束依赖于索引,因此要删除索引,您还必须删除约束。


1
+1 我也会说一致性,因为您通常最终会更改约束以添加INCLUDE,并将其变成索引。 - gbn

33

这篇MSDN文章比较的是SQL Server 2000中两者的区别:http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

对于大多数情况,它们没有区别 - 约束被实现为底层索引。虽然有禁用约束的能力,但在SQL Server中实际上并不起作用。

只有当您想要调整FILLFACTOR等内容时,才会影响您选择哪种方式来实现唯一约束。

SQL Server 2008+添加了INCLUDE以提供更高效的覆盖索引。过滤索引=唯一约束超过行的子集/忽略多个null等情况。


2
这篇文章很好。有趣的是它得出结论:“除了元数据之外,没有实际区别”。 - bobs
哦,哦,引用MSDN的SQL Server 2000教程。 - gbn
2
@gbn:没错,但是有什么变化吗? - OMG Ponies
6
让我们看一下。包括更高效的覆盖索引。过滤索引=对行子集的唯一约束/忽略多个null等。这是两个主要区别。 - gbn

5
我的建议是:当我想描述业务逻辑时,我会使用约束(constraint);而当我想提高性能时,我会使用索引(index)。虽然DBMS中它们可以以相同的方式实现,但这并不意味着定义这些对象的原因的区别不重要。

1

唯一约束仅意味着唯一性,移除约束将会移除引擎创建的索引。可以修改索引以移除其唯一性并仍保留该索引。我认为可以假设大多数强制唯一性的列出于性能原因也适合作为索引; 因此,我主要使用唯一索引。只在需要唯一但对性能表现不佳的列上使用唯一约束(例如需要唯一的varchar(200)),在这种情况下,我希望清楚地指出它是唯一的,但可能不适合搜索,尽管底层具有索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接