【问题标题】:Primary key is bigint and identity, any reasons for preferring non clustered index over clustered index主键是 bigint 和标识,任何首选非聚集索引而不是聚集索引的原因
【发布时间】:2011-10-08 19:48:30
【问题描述】:

我有一个这样定义的表

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 上创建两个非聚集索引就足够了吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我有一个担心。在我的情况下,该表充当两个不同表之间的映射表。我将使用此表进行查找。大多数时候,我不会使用它的主键。这有什么区别吗?
    • @Ankush 主键总是有一个索引(无论它是否是表的聚集索引的选择)。如果您打算通过其他方法进行访问,请考虑对这些键(集群或非集群)进行索引。聚簇索引的选择应该是唯一的、窄的、静态的、递增的。如果你有几个候选人,我会选择最有可能在范围查询中使用的一个,如果不是,可能是一个身份(如你的情况)。
    • 我明白这一点,但这并没有解决我在上述评论中的担忧。我猜你的意思是 DOESN'T 有所作为,并在主键上使用聚集索引。对吗?
    • @Ankush 因为您使用的是标识(唯一、静态、窄、递增)并且它是主键,所以我会继续将其设为聚集索引。这意味着与任何其他选择的聚集索引以及堆相比,您的表将具有一些维护优势(例如,所有非聚集索引中的行书签)。是的,应该使用非聚集索引,但它们应该比在堆上使用更窄、更高效,并且您应该会看到完全不同的执行计划和更多的索引搜索。
    【解决方案2】:

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

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

    Clustered Index Debate

    Clustered Index Debate Continues

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

    【讨论】:

    • +1 Kim Tripp 是关于在 SQL Server 中进行索引的终极资源,当然! :-)
    • @marc - 她知道自己的东西,我喜欢她通常包含易于复制的示例。 Gail shaw 也很适合。
    • 表是否有一个外键引用自己?例如带有 managerid 列的员工表。
    猜你喜欢
    • 2013-05-19
    • 2012-12-21
    • 1970-01-01
    • 2013-08-07
    • 2021-09-07
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多