主键是bigint和identity,优先选择非聚簇索引而不是聚簇索引

时间:2011-07-19 19:10:08

标签: sql performance sql-server-2008 clustered-index non-clustered-index

我有一个像这样定义的表

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所以大部分时间我的查询有SomeTable2IdSomeTable3Id并请求获取其他ID。因此,根据这个表的使用情况,我们真的需要打扰在MyTableId上创建聚簇索引,或者SomeTable2IdSomeTable3Id上的两个非聚簇索引是否足够?

2 个答案:

答案 0 :(得分:4)

不,你肯定应该有一个聚集索引。 Identity字段也是理想的集群密钥。

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

Clustered Index Debate

Clustered Index Debate Continues

Here is a whitepaper from MS about this topic as well.

答案 1 :(得分:1)

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

请记住,您正在选择表是聚簇索引还是堆。聚簇索引不是表上的索引,但标识该表是基于聚簇索引键存储在B树中的。

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

对于读取性能(特别是在更宽的表上),非聚集索引(可能包含列)将是您寻找增益的位置。