为同一列设置聚集索引和非聚集索引是否有意义

Mae*_*024 6 index index-tuning

为同一列设置聚集索引和非聚集索引是否有意义

我继承了一个数据库和一个与之配套的 Web 服务。

查看重复项的索引,我看到两个索引指向同一列(1 列并以相同方式排序)。一个是聚集的,一个不是,这是我看到的唯一区别。

  1. 保留这两个是否有意义?
  2. 如果我删除一个我应该删除哪一个

AMt*_*two 11

在解决这两个问题之前,让我简要定义聚簇索引和非聚簇索引之间的区别。

聚集索引由键列组织。它还包括每隔一列作为行结构的一部分(即,它具有整行)。

非聚集索引也由键列组织。它隐含地包括集群键列(如果表是集群的),或指向行的指针(如果表是堆)。如果INCLUDE明确指定了任何列,它们也将包含在索引结构中。

保留这两个是否有意义?

有一个极端情况,让非聚集索引“复制”聚集索引是有意义的。如果您有一个频繁扫描表的查询,并且仅使用聚集键列,则查询优化器将更喜欢使用非聚集索引。非聚集索引不包含全行数据,因此占用的物理空间较少。因为它占用更少的物理空间,SQL Server 可以用更少的 IO 扫描表,并且出于性能原因将使用它。

可以查询sys.dm_db_index_usage_stats,可以看到两个索引上的user_seeks和的个数user_scans。这将帮助您了解这两个索引的使用情况,并确定这两个索引的有用性。

如果我删除一个,我应该删除哪一个?

作为一般规则,大多数表都应该有一个聚集索引。(那是另外一个话题了)。不知道有关您的索引使用或数据访问的任何详细信息,我猜想如果您要删除一个,您将删除非聚集索引(但是,这确实是基于我所知道的猜测)。

根据聚簇键、数据、数据访问模式等,最正确的答案可能是删除聚簇索引并创建不同的聚簇索引。您可能想阅读有关Effective Clustered Indexes 的更多信息。

  • 它们都被大量使用吗?使用 DMV 是累积的,因此我建议每隔 24 小时查看一次,并计算 1 天的差异。如果频繁使用非聚集索引,您可能需要尝试跟踪哪些代码正在使用该索引,并在没有非聚集索引的情况下对其进行测试。 (2认同)