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会推荐一个,默认情况下把它放在主键列上.
每个表都需要一个聚簇索引和一个主键.默认情况下,PK是群集的,但如果你想要完成它,它可以是非群集的.
您已指定非群集PK,因此探查器建议聚集索引...
注意:没有聚簇索引的表称为"堆",因为它是一堆非结构化数据...