主键自动成为索引吗?

25

如果我运行Profiler,则会建议很多这样的索引

CREATE CLUSTERED INDEX [_dta_index_Users_c_9_292912115__K1] ON [dbo].[Users] 
(
 [UserId] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, 
ONLINE = OFF) ON [PRIMARY]

UserId是Users表的主键。这个索引是否比表中已有的索引更好:

ALTER TABLE [dbo].[Users] ADD  CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED 
(
 [UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
4个回答

39

是的,主键总是一个索引。

如果表上没有其他聚集索引,那么很容易理解:聚集索引使表在每个操作时都更快。是的!确实如此。详情请参见Kim Tripp的The Clustered Index Debate continues

因此,几乎所有有用的表(也许除了批量加载或其他几种罕见情况下的分期表)都应该有一个聚集索引。如果没有一个,DTA会建议您添加一个,并将其默认放在主键列上。


4
除了插入操作外,“...每个操作都使表格更快。” 插入操作是不是需要完成更多的工作,因为它还必须更新索引? - Tomislav Nakic-Alfirevic
2
不要!阅读Kim Tripp的博客文章——引用:“在聚集表中插入比堆更快(但仅适用于“正确”的聚集表)。主要问题在于,在堆中查找IAM / PFS以确定插入位置比在聚集表中慢(在聚集键定义的情况下已知插入位置)。” - marc_s

7
每个表都需要一个聚集索引和一个主键。默认情况下,PK是聚集的,但如果您想要像您所做的那样非聚集,则可以是非聚集的。
您已指定一个非聚集的PK,因此分析器建议使用聚集索引...
注意:没有聚集索引的表被称为“堆”,因为它是一堆未经结构化的数据...

9
未建立索引的表格中的数据肯定是有结构的。 - Charlie
2
每个表都需要一个聚集索引。 注意:没有聚集索引的表... 你自相矛盾了 - 你想表达什么?至于每个表都需要一个主键 - 根据我的经验,SQL Server和大多数DBMS都允许您创建一个没有主键的表。 - Stewart
表格不需要有聚集索引。这就是堆的概念存在的原因。在此文章中搜索“堆”一词 https://learn.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15 - Archmede

2

它基本上建议你将主键设为聚集索引而不是非聚集索引。在大多数情况下,这是一个好的做法。


1

它更好,因为它是集群化的。


默认情况下它是聚类的,但不一定非得这样。 - marc_s
该帖子中的PK明确为非聚集索引。 - wRAR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接