繁体   English   中英

聚集和非聚集索引大数据插入

[英]Clustered and nonclustered index large data insert

我在 5 个键(列)上有一个聚集索引。 我在 2 列上有一个非聚集索引。 因为我在一次运行中插入了 2-3 百万行,所以我将 2 列非聚集索引更改为聚集索引,并将 5 列聚集索引更改为 5 列非聚集索引。 我的问题。

  1. 当使索引聚集时(基本上删除并重新创建索引作为clustered ),我不需要include (任何列),因为这是聚集的?

  2. 我将较少的列索引切换为聚集并将大列聚集索引更改为非聚集通常是否正确? 换句话说,聚集索引应该是简单的还是小的?

  3. 如果我切换这两个索引会不会有任何性能问题?

除非它是链接表,否则通常在 1 列上有聚集索引。 一般建议是为聚集索引列选择尽可能小的类型(当然这符合您的要求)。 拥有许多列不仅会增加大小(每个非聚集索引都存储聚集索引的值 [包括聚集索引]! ),而且还会大大增加外部碎片和降低性能甚至inserts 因此,我对你的问题的回答。

  1. 没错,聚集索引是一张表,不需要包含任何列
  2. 是的,一点没错
  3. 我不确定您是否询问切换本身的性能或具有更小(或更少列)聚集索引的性能影响,所以我将尝试回答两者。
    • 自行切换。 当您将聚集索引切换为非聚集索引时,我相信它应该不会很昂贵(我认为引擎实际上不会对块和范围进行洗牌以制作堆)。 当然,IAM 必须更改,这需要时间。 将非聚集索引更改为聚集索引涉及更多活动。 除了根据聚集索引键移动数据之外,SQLServer 还必须更新所有非聚集索引。
    • 进一步的影响(相当大的话题,我给出了一个非常简短的答案)......较小的聚集索引意味着存储所有其他索引所需的空间更少,这反过来意味着更快地访问数据并减少引擎的资源消耗。

更新我意识到(感谢Aaron Bertrand指出这一点)我对将聚集索引包含在非聚集索引中做了相当模糊的声明。 为了绝对正确,每个非聚集索引都包含指向行的行定位器。 当表被聚簇时,行定位器是聚簇索引键。 有关聚集索引的更多信息: [1] , [2]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM