1

最近审查了一个相当高的流量表,定义如下:

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多余的吗?

4

3 回答 3

2

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

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

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

于 2012-06-18T19:05:13.773 回答
1

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

如果对于colOtherId的每个 valor 都具有并采用很多值,则仅在 where 中查询将花费更多时间,而没有看似冗余的索引比使用它。 SomeIdSomeId

于 2013-06-06T07:28:13.333 回答
1

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

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

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

于 2012-06-18T15:28:17.673 回答