【问题标题】:Is this index redundant?这个索引是多余的吗?
【发布时间】:2012-06-18 15:22:45
【问题描述】:

最近对一个相当高的流量表的评论定义如下:

CREATE TABLE [dbo].[SomeTable](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [SomeId] [bigint] NOT NULL,
    [Time] [time](0) NOT NULL,
    [InsertTime] [datetime] NOT NULL,
    [SequenceNumber] [int] NOT NULL,
    [OtherId] [int] NULL,
 CONSTRAINT [PK_Tracks] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

揭示了以下索引定义:

CREATE NONCLUSTERED INDEX [i1] ON [dbo].[SomeTable] 
(
    [SomeId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

-和-

CREATE NONCLUSTERED INDEX [i2] ON [dbo].[SomeTable] 
(
    [SomeId] ASC,
    [OtherId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

这个领域真的不是我的强项,但索引i1不是多余的吗?

【问题讨论】:

  • 表定义包括聚集索引键和数据类型?第一个有点窄,所以如果OtherId 很宽,可能会更受欢迎。或者,如果OtherId 是 CI 密钥的一部分,那么它也将是第一个 NCI 密钥的隐藏部分。
  • 它对我来说似乎是多余的...[SomeId][i2] 中的前导列,并且可以有效地用于与[i1] 相同的查询。
  • @spender - 看不到有关数据类型或 CI 密钥的任何信息。
  • @spender - OtherId 只有 4 个字节,所以基本上是多余的。仅由SomeId 查找的查询可能会因使用它而略微减少读取次数,但可能不值得开销,除非您的数据库或多或少是只读的并且都适合缓存,因此拥有两个非常相似的副本不是t 取代任何更有用的东西。

标签: sql sql-server sql-server-2008 indexing


【解决方案1】:

也许,也许不是。如果您是优化器,您会为以下查询使用哪个索引:

select [SomeId]
from [dbo].[SomeTable]

如果该查询对您的应用程序至关重要并且表很大,那么拥有该目标索引可能会很有用。但是您说得对,i1 可以满足的任何查询也可以由 i2 满足(可能成本更高)。

【讨论】:

    【解决方案2】:

    是的,它是多余的。当有人添加新索引而不检查它是否使任何现有索引变得多余时,您通常会遇到这种情况。

    您会发现值得阅读this post,它描述了明显冗余索引有用的情况。但是,由于您的表格不包含大列,因此不适用于您。

    作为参考,this blog 描述了如何从数据库中消除冗余索引。

    【讨论】:

      【解决方案3】:

      在加权索引的冗余时,您不仅应该考虑i2 中额外列的宽度,还应该考虑它相对于第一列的粒度。

      如果OtherIdSomeId 列的每个值都有很多值,那么在where 中只有SomeId 的查询在没有看似冗余的索引的情况下会花费更多的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 2013-11-21
        • 2016-08-27
        相关资源
        最近更新 更多