唯一约束与唯一索引

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

除了performance评估最佳解决scheme是否有其他原因?

有没有数据库pipe理的好处之一?

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

对于大多数目的来说,没有什么区别 – 约束是作为一个索引来实现的。 尽pipe有禁用约束的function,但在SQL Server中实际上并不起作用。

它只是如果你想调整像FILLFACTOR等的东西,你想要实现的唯一约束。

SQL Server 2008+增加了INCLUDE来提供更高效的覆盖索引。 已过滤的索引=行的子集上的唯一约束/忽略多个空等

他们没有明显的不同。 当你创build一个唯一的约束时,SQL Server会自动为你创build一个唯一的索引。

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

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

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

我的两分钱:当我想要提高性能时,我想用描述业务逻辑和索引的约束。 他们可以在数据库pipe理系统中实现相同的事实并不意味着定义这些对象的原因之间的区别并不重要。

唯一的约束只意味着唯一性,约束的移除将删除引擎创build的索引。 一个索引可以改变,以消除它的唯一性,你仍然有你的索引。 我认为可以假设,大多数的专栏将强制独特性也很好地作为性能原因的指标; ergo,我大多使用独特的索引。 我只在需要唯一的列上使用惟一的约束,但性能不佳(即varchar(200)需要唯一)。 在这种情况下,我想清楚地指出,尽pipe存在潜在的索引,但它可能不是一个好主意。