这个索引是多余的吗?

时间:2012-06-18 15:22:46

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

如果OtherId拥有并为SomeId col的每个valor获取了大量值,那么在哪里只有SomeId的查询将花费更多时间而没有看似冗余的索引而不是它。