首页 > 解决方案 > 多重索引个性:边界重复键

问题描述

我正在从 Brent Ozar 运行 sp_BlitzIndex,并获得了许多这些项目。

Multiple Index Personalities: Borderline duplicate keys

我不是 100% 知道该怎么做,但下面是一个例子。

CREATE INDEX [IX_Test] ON [Test] ( [SportId] ) WITH (FILLFACTOR=100, ONLINE=?, SORT_IN_TEMPDB=?, DATA_COMPRESSION=?);

CREATE UNIQUE INDEX [IX_Test_2] ON [Test] ( [SportId], [AnotherId] ) WITH (FILLFACTOR=100, ONLINE=?, SORT_IN_TEMPDB=?, DATA_COMPRESSION=?);

如您所见,它们看起来很相似。我的问题是删除第一个索引 SportID 但保留双索引(SportId,TextId)是否会造成伤害。

我在这里最好的方法是什么?

标签: sqlsql-serverdatabaseindexingnon-clustered-index

解决方案


第一个索引 IX_Test 是多余的,因为它的第一个最具选择性的列由索引 IX_Test_2 复制。

这两个索引都可以满足对 SportId 的键或范围对特定行的查找,第二个索引还包括一个附加列,因此涵盖了需要两者或按 AnotherId 排序的查询。

在没有第一个索引的情况下,优化器可以同样好地利用第二个索引,并且添加单个 int 列虽然使索引稍宽,但可以忽略不计,并且可以通过减少维护两者的开销来抵消。


推荐阅读