主键是否自动成为索引?

Lie*_*oen 16 sql-server indexing constraints primary-key

如果我运行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]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 24

是的,主键始终是索引.

如果表上没有任何其他聚簇索引,那么很容易:聚簇索引使表更快,适用于每个操作.是!确实如此.请参阅Kim Tripp的优秀The Clustered Index辩论继续获取背景信息.

实际上,每个有用的表(除了可能是用于bulkload的临时表或其他一些罕见的情况)都应该有一个聚簇索引.如果你没有,很明显DTA会推荐一个,默认情况下把它放在主键列上.

  • "......除了插入之外,每个操作都会使表更快吗?不插入还有更多工作要做,因为它还必须更新索引吗? (3认同)
  • 没有!!阅读Kim Tripp的博客文章 - 引用:"插入**在集群表中更快**(但仅在"正确的"集群表中)比堆更快.这里的主要问题是在IAM/PFS中查找到确定堆中的插入位置比群集表中慢(其中插入位置是已知的,由群集密钥定义). (2认同)

gbn*_*gbn 6

每个表都需要一个聚簇索引和一个主键.默认情况下,PK是群集的,但如果你想要完成它,它可以是非群集的.

您已指定非群集PK,因此探查器建议聚集索引...

注意:没有聚簇索引的表称为"堆",因为它是一堆非结构化数据...

  • 非索引表中的数据肯定是结构化的 (4认同)
  • “每个表都需要一个聚簇索引”“注意:一个没有聚簇索引的表...。”您在那里矛盾了–您的意思是什么?至于每个需要主键的表,根据我的经验,SQL Server将允许您创建一个没有主表的表,大多数DBMS也会这样做。 (2认同)