最近对流量表相当高的评论定义如下:
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
多余的吗?
答案 0 :(得分:2)
也许,也许不是。如果您是优化器,您将使用哪个索引进行以下查询:
select [SomeId]
from [dbo].[SomeTable]
如果该查询对您的应用程序至关重要且该表很大,那么拥有该目标索引可能会很有用。但你是对的,因为i1可以满足的任何查询也可以被i2满足(也许更昂贵)。
答案 1 :(得分:1)
是的,这是多余的。当有人添加新索引而不检查是否会使任何现有索引冗余时,您通常会遇到这种情况。
你会发现值得阅读this post来描述显然冗余索引有用的情况。但是,由于您的表格不包含大列,因此不适用于您。
作为参考,this blog描述了如何从数据库中消除冗余索引。
答案 2 :(得分:1)
当您对索引的冗余进行加权时,您不仅应考虑i2
中额外列的宽度,还应考虑与第一列相关的粒度。
如果OtherId
拥有并为SomeId
col的每个valor获取了大量值,那么在哪里只有SomeId
的查询将花费更多时间而没有看似冗余的索引而不是它。