2010-07-21 151 views
41

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

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

是否有数据库管理优势之一?

回答

30

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

在大多数情况下,没有任何区别 - 约束来作为幕后的索引。尽管有禁用约束的功能,但它在SQL Server中并不实际。

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

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

+2

该文章很好。有趣的是,除了元数据之外,它总结出“没有实际的区别”。 – bobs 2010-07-21 04:39:28

+0

啧啧,引用MSDN的SQL Server 2000 – gbn 2010-07-21 05:02:51

+2

@gbn:是的,但有什么改变? – 2010-07-21 05:06:54

26

它们是not significantly different.当你创建一个唯一约束时,SQL Server会自动为你创建一个唯一的索引。

随着语法创建索引,可能有更好的控制定义唯一索引来指定clustered /非聚集,包含的列,文件组,索引滤波(SqlSvr2008)等

约束是优选在最因为它表达了唯一性的意图:它是一个约束。索引没有传达这个意图。

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

+1

+1我还想说一致性,以及你通常最终将约束更改为索引以添加INCLUDE – gbn 2010-07-21 05:04:18

1

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

2

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