1

我有一个这样定义的表

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映射其他两个表的情况SomeTable2SomeTable3而不是有复合键,我们有这个MyTableId所以大多数时候我的查询有一个SomeTable2IdorSomeTable3Id和请求获取其他 id。因此,鉴于此表的使用情况,我们真的需要在上面创建一个聚集索引MyTableId还是两个非聚集索引SomeTable2IdSomeTable3Id足够了?

4

2 回答 2

4

不,你绝对应该在那里有一个聚集索引。该Identity字段也是一个理想的簇键。

以下是 Kim Tripp 关于聚集索引的一些好文章:

聚集索引辩论

聚集索引辩论仍在继续

这是来自 MS 的关于此主题的白皮书。

于 2011-07-19T19:13:17.913 回答
1

我认为您绝对应该将 MyTableId 作为聚集索引中的键,而无需进一步了解该表的实际使用方式。

请记住,您是在表是聚集索引还是堆之间进行选择。聚集索引不是表上的索引,而是根据聚集索引键标识表存储在 B 树中。

在这两种表上,也可以使用非聚集索引。

对于读取性能(特别是在更宽的表上),非聚集索引(可能带有包含的列)将是您寻求收益的地方。

于 2011-10-15T02:30:20.780 回答