我有一个像这样定义的表
CREATE TABLE [dbo].[MyTable](
[MyTableId] [bigint] IDENTITY(1,1) NOT NULL,
[SomeTable2Id] [bigint] NOT NULL,
[SomeTable3Id] [bigint] NOT NULL,
[SomeData] [smallint] NOT NULL,
CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED
(
[MyTableId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
除了上面的PK_MyTable NONCLUSTERED索引,我在SomeTable2Id和SomeTable3Id上的其他NONCLUSTERED索引很少
我认为在上面创建CLUSTERED索引更有意义,但我想知道是否有任何理由不创建CLUSTERED索引而是创建NONCLUSTERED?
PS有很多关于这些主题的问题,但找不到相关的问题(在前20名列表中)。如果有人问过,请将我转到相关的问题帖子。编辑:考虑MyTable
正在映射另外两个表SomeTable2
和SomeTable3
的情况,而不是使用复合键,我们有MyTableId
所以大部分时间我的查询有SomeTable2Id
或SomeTable3Id
并请求获取其他ID。因此,根据这个表的使用情况,我们真的需要打扰在MyTableId
上创建聚簇索引,或者SomeTable2Id
和SomeTable3Id
上的两个非聚簇索引是否足够?
答案 0 :(得分:4)
答案 1 :(得分:1)
我认为你绝对应该将MyTableId作为聚集索引中的密钥,而无需进一步了解表的实际使用方式。
请记住,您正在选择表是聚簇索引还是堆。聚簇索引不是表上的索引,但标识该表是基于聚簇索引键存储在B树中的。
在两种表上,也可以使用非聚集索引。
对于读取性能(特别是在更宽的表上),非聚集索引(可能包含列)将是您寻找增益的位置。