1

我已经被这样的主键BIGINT和身份,超过聚集索引更喜欢非聚集索引任何理由

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

我认为上面创建CLUSTERED索引更有意义,但我想知道有没有很好的理由不创建一个CLUSTERED索引,而是创建NONCLUSTERED?

PS对这些主题提出了很多问题,但找不到相关的问题(前20名)。如果有问题,请将我重定向到相关的问题。

编辑:考虑这样MyTable被映射其他两个表SomeTable2SomeTable3和而不是有复合键的情况下,我们有这个MyTableId所以大部分时间我的查询要么SomeTable2IdSomeTable3Id,并要求得到其他ID。因此,根据这张表格的使用情况,我们是否真的需要在MyTableId之上创建聚集索引,或者是否有两个非聚集索引SomeTable2IdSomeTable3Id就足够了?

回答

1

我想你一定要有MyTableId为您聚簇索引中的关键而没有关于如何实际使用表格的进一步信息。

请记住,您是在作为聚集索引或堆的表之间进行选择。聚簇索引不是表上的索引,但是标识该表基于聚簇索引键存储在B树中。

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

对于读取性能(特别是在更宽的表格中),非聚集索引(可能包含列)将成为您寻找收益的地方。

+0

谢谢。我有一个问题。在我的情况下,这个表充当两张不同表之间的映射表。我将使用这张表进行查找。大多数时候,我不会使用它的主键。这是否有所作为? – Ankush

+0

@Ankush主键总是有一个索引(不管它是否是表的聚集索引的选择)。如果您要通过其他方法访问,请考虑对这些键(群集或非群集)编制索引。聚类指数的选择应该是独特的,狭窄的,静态的,并且越来越多。如果你有几个候选人,我会选择最有可能用于范围查询的人,如果不是,可能是一个身份(如你的情况)。 –

+0

我明白,但这并没有解决我在上述评论中的担忧。我想你的意思是**不会**有所作为,并与主键上的聚集索引。对? – Ankush

4

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

下面是金特里普关于聚集索引的一些好文章:

Clustered Index Debate

Clustered Index Debate Continues

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

+1

+1 Kim Tripp是SQL Server索引的最终资源,当然! :-) –

+1

@marc - 她知道她的东西,我喜欢她通常包含容易重现的例子。盖尔肖也很棒。 – JNK

+0

是否有关系,如果表有一个外键引用自己?例如员工表与managerid列。 – Ankush