【发布时间】: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