【发布时间】:2011-03-18 19:06:21
【问题描述】:
我有兴趣了解开发人员更喜欢使用哪种技术来强制 SQL Server 中的唯一性:UNIQUE CONSTRAINT 或 UNIQUE INDEX。鉴于每种方法的物理实现几乎没有区别,您如何确定哪个最好?
除了性能之外还有其他原因来评估最佳解决方案吗?
其中一个或另一个有数据库管理优势吗?
【问题讨论】:
标签: sql-server database-design unique-constraint unique-index
我有兴趣了解开发人员更喜欢使用哪种技术来强制 SQL Server 中的唯一性:UNIQUE CONSTRAINT 或 UNIQUE INDEX。鉴于每种方法的物理实现几乎没有区别,您如何确定哪个最好?
除了性能之外还有其他原因来评估最佳解决方案吗?
其中一个或另一个有数据库管理优势吗?
【问题讨论】:
标签: sql-server database-design unique-constraint unique-index
这篇比较两者的 MSDN 文章适用于 SQL Server 2000:http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx
在大多数情况下,没有区别 - 约束是作为索引实现的。虽然可以禁用约束,但它实际上在 SQL Server 中不起作用。
只有当你想调整诸如 FILLFACTOR 之类的东西以实现唯一约束时才重要。
SQL Server 2008+ 添加了INCLUDE 以提供更有效的覆盖索引。过滤索引 = 对行子集的唯一约束/忽略多个 null 等。
【讨论】:
它们是not significantly different. 当你创建一个唯一约束时,SQL Server 会自动为你创建一个唯一索引。
使用创建索引的语法,您可以更好地控制定义唯一索引以指定聚集/非聚集、包含列、文件组、索引过滤 (SqlSvr2008) 等。
在大多数情况下,约束是可取的,因为它表达了唯一性的意图:它是一个约束。索引不会传达这种意图。
至于可管理性,影响很小。您可以管理索引(重建、重组),就好像它是独立于约束创建的一样。唯一的区别是约束依赖于索引,所以要删除索引,必须同时删除约束。
【讨论】:
我的两分钱:当我想描述业务逻辑时我会使用约束,当我想提高性能时我会使用索引。它们可以在 DBMS 中实现相同的事实并不意味着定义这些对象的原因之间的区别并不重要。
【讨论】:
唯一约束仅意味着唯一性,删除约束将删除引擎创建的索引。可以更改索引以消除其唯一性,并且您仍然拥有索引。我认为可以假设出于性能原因,大多数列会强制唯一性也可以很好地用作索引;因此,我主要使用唯一索引。我只对需要唯一但性能不佳的列使用唯一约束(即需要唯一的 varchar(200));在这种情况下,我想明确指出它是独一无二的,但尽管有基础索引,但搜索它可能不是一个好主意。
【讨论】: