2010-03-12 78 views
13

如果我运行探查,那么它意味着很多指标像这样的主键是否自动成为索引?

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] 

用户ID是用户表的主键。该指数是否比表中已有的指标更好:

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] 

回答

6

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

您指定一个非聚集PK所以探查表明一个聚集索引...

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

+4

未索引表中的数据肯定是结构化的 – Charlie

+0

“每个表都需要聚簇索引” “注意:没有聚簇索引的表......” 您在那里反驳了自己 - 您是什么意思? 至于每个表需要一个主键 - 根据我的经验,SQL Server将允许您创建一个没有的表,就像大多数DBMS一样。 – Stewart

1

这是因为它是聚集在一起的。

+0

默认情况下它是群集的,但不一定是 –

+0

帖子中的PK是显式非群集的。 – wRAR

2

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

21

是的主键始终是一个索引。

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

所以,真正的,每个有用的表(除了可能用于bulkload的登台表或另外几个罕见的情况)应该有一个聚集索引。如果你没有,那么DTA会推荐一个,默认情况下它会放在主键列上。

+3

“...为插入以外的每个操作更快地创建表格”?不插入有更多的工作要做,因为它也必须更新索引? –

+2

不!!阅读Kim Tripp的博客文章 - 引用:“与堆相比,插入**在聚簇表**中更快(但只在”正确“聚簇表中)。这里的主要问题是在IAM/PFS中查找确定堆中的插入位置比群集表中的插入位置慢(插入位置已知,由群集键定义)“。 –