Yar*_*evi 1 sql-server indexing unique-constraint clustered-index sql-server-2008
在SQL Server中,我有一个不可为空的列,其上有唯一的聚簇索引.如果我将此列设为主键,则会自动创建完全相同的索引,并且该列将被识别为主键.
我理解抽象/语义差异.
(主键标识实体,而具有此索引的任何其他列可能不会.
例如,Person可以具有唯一,不可为空的电子邮件字段......但可以更改)
但令我困扰的是数据库引擎本身的实际差异.
如果我只是创建一个Id列,使其不可为空,为它创建一个唯一的聚簇索引,使其成为身份增量,但没有主键约束会发生什么?
在什么情况下主键约束发挥作用?
(在我提出这个问题之前,我已经查看了很多相关的问题,但我看到的所有答案都以抽象/理论解释结束).
真的没有什么不同.您指定PRIMARY KEY
转发您的意图,而不是引擎做任何不同的事情.在构造查询计划时,优化器仍将对其所有属性使用唯一性,并且仍将对其所有属性使用聚簇索引,无论您是否在技术上将其创建为PRIMARY KEY
.创建a时FOREIGN KEY
,仍然可以引用指定为唯一的列(已集群或未集群).区别仅在于元数据(sys.indexes.is_primary_key
)和SSMS对您的表示(哦,您可以在NULLable列上创建唯一的聚簇索引,但不能PRIMARY KEY
在该列上创建).
实际上,在许多情况下,您希望将聚簇索引与其完全分离PRIMARY KEY
.例如,如果您有一个表是PK是GUID的表,并且您通常对该表运行日期范围查询,那么最好不要将PK设置为非群集并且在自然增加的列上具有聚簇索引(日期时间列) - 两者都可以最大限度地减少重插入活动的页面拆分,也可以最大限度地协助日期范围查询.非聚集索引非常适合查找单个GUID.(我想提一下,因为很多人认为主键必须是聚集的.不正确.)
还有一点值得注意的是,如果您创建一个PRIMARY KEY
约束,然后创建一个使用相同名称的唯一聚簇索引DROP_EXISTING
,该is_primary_key
列仍将是,1
并且对象资源管理器仍将显示索引名称Keys
.