【问题标题】:Why is my Primary Key slowing down my queries?为什么我的主键会减慢我的查询速度?
【发布时间】:2009-06-08 10:16:33
【问题描述】:

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

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

我创建了两个索引:一个用于 Alias,另一个用于 DataType。 然而,我刚刚注意到一些奇怪的事情。 运行以下查询时:

SELECT * FROM IDENTIFIER WHERE DataType = 1

使用索引和主键的查询实际上比没有它们时运行得更慢;大约需要10秒的时间!索引没有碎片 - 我检查过 - 我也在使用这个

GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
DBCC FREEPROCCACHE;
GO

在查询本身之前。

这张表相当大,上面有几百万个条目。索引和 PK 在大多数查询中都起着至关重要的作用,但在这种情况下,我无法理解为什么查询运行 slower 与它们一起。有什么想法吗?

提前致谢

编辑:执行计划显示只使用聚集索引,并且 DataType 变量当前上升到 150。

【问题讨论】:

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

标签: sql-server performance indexing


【解决方案1】:

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

所以性能的关键是要有一个非聚集索引(这是一个坏名字,真的,因为非聚集索引通常远远优于聚集索引)和INCLUDE 索引中的附加列,以便它变为@ 987654322@。对于 SQL Server 2005 之前的版本,您只需将列添加到索引的末尾即可。

因此,基本上,主键是好的,但不一定决定您对集群的选择,并且您通常需要依赖非集群索引(适当的 INCLUDEed 列)来获得大多数选择性操作的性能, 聚簇索引专为选择性最低和最常排序的情况而设计。

【讨论】:

    【解决方案2】:

    在DataType 上创建一个包含Alias 列的复合非聚集覆盖索引,并删除Alias 和DataType 列上的单个索引:

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

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多