45

我有兴趣了解开发人员更喜欢使用哪种技术来强制 SQL Server 中的唯一性:UNIQUE CONSTRAINT 或 UNIQUE INDEX。鉴于每个的物理实现几乎没有区别,你如何决定哪个是最好的?

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

两者之间是否存在数据库管理优势?

4

4 回答 4

33

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

对于大多数目的,没有区别 - 约束是作为索引实现的。尽管可以禁用约束,但它实际上在 SQL Server 中不起作用。

仅当您想调整诸如 FILLFACTOR 之类的内容以实现唯一约束时才重要。

添加了 SQL Server 2008+INCLUDE以提供更有效的覆盖索引。过滤索引 = 对行子集的唯一约束/忽略多个空值等。

于 2010-07-21T04:10:47.287 回答
32

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

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

在大多数情况下,约束是可取的,因为它表达了唯一性的意图:它是一个约束。索引不传达这种意图。

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

于 2010-07-21T04:09:20.363 回答
5

我的两分钱:当我想描述业务逻辑时我会使用约束,当我想提高性能时我会使用索引。它们可以在 DBMS 中以相同方式实现这一事实并不意味着定义这些对象的原因之间的区别并不重要。

于 2016-10-27T18:33:34.340 回答
1

唯一约束仅意味着唯一性,删除约束将删除引擎创建的索引。可以更改索引以消除其唯一性,并且您仍然拥有索引。我认为可以假设出于性能原因,大多数列会强制唯一性也可以很好地用作索引;因此,我主要使用唯一索引。我只对需要唯一但性能不佳的列使用唯一约束(即需要唯一的 varchar(200));在这种情况下,我想明确指出它是独一无二的,但尽管有基础索引,但搜索它可能不是一个好主意。

于 2015-09-14T21:23:59.600 回答