当前位置: 首页 > 面试题库 >

在SQL 2005中更改聚集索引(PK)的最佳方法

卞安邦
2023-03-14
问题内容

我有一个表,该表在两列上都有聚集索引-该表的主键。它的定义如下:

ALTER TABLE Table ADD  CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
(
  [ColA] ASC,
  [ColB] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

我想删除此聚簇索引PK并添加如下聚簇索引,并使用非聚簇索引添加主键约束,如下所示。

CREATE CLUSTERED INDEX [IX_Clustered] ON [Table] 
(
  [ColC] ASC,
  [ColA] ASC,
  [ColD] ASC,
  [ColE] ASC,
  [ColF] ASC,
  [ColG] ASC
)WITH (PAD_INDEX  = ON, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,     DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 90, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = OFF) ON [PRIMARY]

ALTER TABLE Table ADD CONSTRAINT
  PK_Table PRIMARY KEY NONCLUSTERED 
  (
    ColA,
    ColB
  ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

我打算只下降的PK聚集索引,然后添加新的聚集索引,然后添加非聚集主键索引,但我了解到,丢弃现有的聚集索引将导致表数据重新排序认为这不是必需的。桌子敲了1
TB,所以我真的想避免任何不必要的重新排序

我的问题是,从现有结构转到所需结构的最佳方法是什么?

编辑:只想澄清一下。该表为1TB,很遗憾,我没有空间来创建临时表。如果有没有创建临时表的方法,请告诉我。


问题答案:

如果您的表的大小已达到1 TB,并且其中可能有很多行,那么我强烈建议不要使聚集索引更胖!

首先,删除并重新创建聚簇索引将使您的所有数据至少随机洗一次-仅此一项将花费很多时间。

其次,您要创建的大型复合聚簇索引将显着增加所有非聚簇索引的大小(因为对于书签查找,它们包含每个叶节点上的整个聚簇索引值)。

问题更多:您为什么要尝试这样做?您是否不能仅在这些列中添加另一个非聚集索引来潜在地覆盖您的查询?为什么这必须是聚簇索引?我认为这没有任何优势。

有关索引的更多信息,尤其是有关聚集索引的争论,请参见Kimberly
Tripp的
有关SQL
Server索引的博客-非常有帮助!

马克



 类似资料:
  • 问题内容: 当我查看特定查询的执行计划时,我发现我的成本的77%在聚簇索引查找中。 我使用聚集索引的事实是否意味着我不会因为输出的列而看到性能问题? 对我来说,创建一个非聚集版本并包含所有正在输出的列会更好吗? 更新:聚集索引使用组合键。不知道这是否有所作为。 问题答案: 使用非聚集索引上的包含列的原因是为了避免对聚集数据进行“书签查找”。问题是,如果SQL Server _理论上可以_使用特定的

  • 问题内容: 我的表(a,b,c,d)中有四列,它们全都依赖于列(日期),所以在查询中我有: 我需要知道为所有索引创建索引的最佳方法是什么,我有两个建议: 第一个建议: 第二个建议: 请使用哪个更好。 问题答案: 这可能对您有帮助: 要索引的列应该是用于过滤的列(子句)。您可以添加以避免查询。

  • 本文向大家介绍SQL Server中的聚集索引和非聚集索引之间的区别,包括了SQL Server中的聚集索引和非聚集索引之间的区别的使用技巧和注意事项,需要的朋友参考一下 索引是与实际表或视图相关联的查找表,数据库使用该查找表来改善数据检索性能的计时。在index中, 键存储在结构(B树)中,该结构使SQL Server可以快速有效地查找与键值关联的一行或多行。如果在表上定义了主键和唯一约束,则会

  • 本文向大家介绍sql 聚集索引和非聚集索引(详细整理),包括了sql 聚集索引和非聚集索引(详细整理)的使用技巧和注意事项,需要的朋友参考一下 聚集索引    一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索

  • 问题内容: 我有一个变量(通过set_fact)包含一个json字符串: 在“资源”数组中插入更多元素的最佳方法是什么? 我正在探索将变量转储到文件中,并使用外部shell工具插入所需的块,这似乎并不好。 问题答案: 我不知道 最好的 方法,但是一种选择是编写一个简单的库模块来为您处理更新的机制。您可以使用该模块来查找要修改的数据,然后将修改后的对象返回到ansible。起点可能看起来像: 如果将

  • 本文向大家介绍MySQL索引之聚集索引介绍,包括了MySQL索引之聚集索引介绍的使用技巧和注意事项,需要的朋友参考一下 在MySQL里,聚集索引和非聚集索引分别是什么意思,有什么区别? 在MySQL中,InnoDB引擎表是(聚集)索引组织表(clustered index organize table),而MyISAM引擎表则是堆组织表(heap organize table)。 也有人把聚集索引