主键是否自动成为索引?

时间:2010-03-12 17:20:35

标签: sql-server indexing primary-key constraints

如果我运行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 个答案:

答案 0 :(得分:24)

是的,主键始终是索引。

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

本质上建议您将主键设置为聚簇索引而不是非聚簇索引。在大多数情况下,这将是一件好事。

答案 3 :(得分:1)

它更好,因为它是聚集的。