我对学习开发人员在SQL Server中强制实现唯一性的技术有兴趣:UNIQUE CONSTRAINT还是UNIQUE INDEX。考虑到两者的物理实现几乎没有区别,您如何决定哪种方法最好?
除了性能之外还有什么原因来评估最佳解决方案吗?
其中一个优于另一个的数据库管理优势吗?
我对学习开发人员在SQL Server中强制实现唯一性的技术有兴趣:UNIQUE CONSTRAINT还是UNIQUE INDEX。考虑到两者的物理实现几乎没有区别,您如何决定哪种方法最好?
除了性能之外还有什么原因来评估最佳解决方案吗?
其中一个优于另一个的数据库管理优势吗?
他们没有显著的不同。当您创建唯一约束时,SQL Server会自动为您创建唯一索引。
通过创建索引的语法,您可以更好地控制定义唯一索引以指定聚集/非聚集、包含的列、文件组、索引过滤(SqlSvr2008)等。
在大多数情况下,约束是首选,因为它表达了独特性的意图:它是一个约束。索引无法传达这种意图。
至于可管理性,影响很小。您可以像独立创建索引一样管理索引(重建、重新组织)。唯一的区别是约束依赖于索引,因此要删除索引,您还必须删除约束。
这篇MSDN文章比较的是SQL Server 2000中两者的区别:http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx
对于大多数情况,它们没有区别 - 约束被实现为底层索引。虽然有禁用约束的能力,但在SQL Server中实际上并不起作用。
只有当您想要调整FILLFACTOR等内容时,才会影响您选择哪种方式来实现唯一约束。
SQL Server 2008+添加了INCLUDE
以提供更高效的覆盖索引。过滤索引=唯一约束超过行的子集/忽略多个null等情况。
唯一约束仅意味着唯一性,移除约束将会移除引擎创建的索引。可以修改索引以移除其唯一性并仍保留该索引。我认为可以假设大多数强制唯一性的列出于性能原因也适合作为索引; 因此,我主要使用唯一索引。只在需要唯一但对性能表现不佳的列上使用唯一约束(例如需要唯一的varchar(200)),在这种情况下,我希望清楚地指出它是唯一的,但可能不适合搜索,尽管底层具有索引。