【问题标题】:Include additional columns in a non clustered primary key index在非聚集主键索引中包含其他列
【发布时间】:2013-03-27 15:25:13
【问题描述】:

我已将表上的主键定义为nonclustered。对于由create nonclustered index 显式创建的非聚集索引,可以包含其他(非索引)列。隐式创建的主键非聚集索引也可以吗?

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    INCLUDE 列的语法仅适用于CREATE NONCLUSTERED INDEX,特别是

    INCLUDE (column [ ,... n ] ) 指定要添加的非键列 到非聚集索引的叶级。非聚集索引 可以是唯一的或非唯一的。

    它是否不适用于 ADD CONSTRAINT,因此您不能包含任何具有主键的列,即使它是非集群的。

    PRIMARY KEY 可用作记录的唯一标识符,并且是可用于 REFERENTIAL 约束的候选键。但是,出于性能原因,如果您在另一列上有一个聚类键,并且没有其他候选键可作为 PK 提升,您始终可以创建一个 additional 非主键列上的聚集索引,并在索引中包含其他列。

    【讨论】:

    • 谢谢。但是,是否可以 (a) 修改或替换隐式创建的索引,或 (b) 在 之前创建具有附加列的唯一非聚集索引,以使用此索引而不是隐式创建主键索引?
    • 无法将非聚集索引与主键合并,也无法“在索引之上创建 PK 约束”。主键约束创建一个非常轻的索引(不包含列),以尽可能快地进行约束检查(非空和唯一)。
    【解决方案2】:

    虽然无法使用主键或唯一约束指定包含列,但一种解决方法是使用具有相同键的唯一非聚集索引以及包含列。这不仅提供与主键约束相同的唯一性保证,外键也可以reference a unique constraint/index key,提供与被引用主键相同的引用完整性。

    这种方法的优势在于特殊用例的性能,例如当最佳聚集索引选择不是主键并且包含列对性能而言是可取的。

    缺点是只能指定带有主键约束的声明性级联 DRI,而且不直观。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2018-02-17
      • 1970-01-01
      • 2012-12-30
      相关资源
      最近更新 更多