Sql server 为什么我的主键会减慢我的查询速度?

Sql server 为什么我的主键会减慢我的查询速度?,sql-server,performance,indexing,Sql Server,Performance,Indexing,我正在使用SQLServer2008,在我的一个表中,我在其标识符上实现了一个(集群)主键。以下是表格说明: 标识符: -IdentifierId int不为空PK -别名nvarchar(200) -数据类型int不为NULL 我创建了两个索引:一个用于别名,另一个用于数据类型。 然而,我只是注意到了一些奇怪的事情。 运行以下查询时: SELECT * FROM IDENTIFIER WHERE DataType = 1 有索引和主键的查询实际上比没有索引和主键的查询运行得慢;这需要大约10

我正在使用SQLServer2008,在我的一个表中,我在其标识符上实现了一个(集群)主键。以下是表格说明:

标识符: -IdentifierId int不为空PK -别名nvarchar(200) -数据类型int不为NULL

我创建了两个索引:一个用于别名,另一个用于数据类型。 然而,我只是注意到了一些奇怪的事情。 运行以下查询时:

SELECT * FROM IDENTIFIER WHERE DataType = 1
有索引和主键的查询实际上比没有索引和主键的查询运行得慢;这需要大约10秒的时间!索引并不是零碎的——我检查过了——我也在使用这个

GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
DBCC FREEPROCCACHE;
GO
在查询本身之前

这个表相当大,有几百万个条目。索引和PK在大多数查询中起着至关重要的作用,但在这种情况下,我无法理解为什么查询运行得较慢。有什么想法吗

提前谢谢


编辑:执行计划显示仅使用聚集索引,数据类型变量当前增加到150。

数据类型
上创建包含列
别名
的复合非聚集覆盖索引,并删除
别名
数据类型
列上的单个索引:

CREATE NONCLUSTERED INDEX NC_DataType_I_Alias 
    ON tblIdentifier(DataType) INCLUDE (Alias)

选择*时,系统仍需要获取每一列。因此,优化器通常会确定使用聚集索引扫描(请记住,聚集索引不是真正的索引-它只是按指定顺序组织的数据)比使用对不同索引的查找与基于主键的书签查找相结合来检索其他行更快

因此,性能的关键是要有一个非聚集索引(实际上,这是一个坏名字,因为非聚集索引通常比聚集索引好得多),并且
在索引中包含
额外的列,以便它成为
覆盖
。对于SQL Server 2005之前的版本,只需将列添加到索引的末尾即可


因此,基本上,主键是好的,但不一定决定您对集群的选择,您通常需要依靠非集群索引(具有适当的
INCLUDE
ed列)来实现大多数选择性操作的性能,使用针对选择性最低和最常见排序情况设计的聚集索引。

您是否查看了生成的执行计划?数据类型列的选择性如何?(即该列可以有多少个值)?刚刚回答:只有聚集索引和数据类型的值从1到150