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

时间:2013-06-08 20:57:13

标签: sql sql-server indexing sql-server-2012

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

  1. 在对索引进行聚类时(基本上删除并重新创建索引为clustered),我不需要include(任何列),因为这是聚类的?

  2. 将less列索引切换为clustered并将大列聚簇索引更改为unclustered一般是否正确?换句话说,聚集索引应该简单而小?

  3. 如果切换这两个索引,是否存在任何性能问题?

1 个答案:

答案 0 :(得分:0)

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

  1. 这是正确的,聚集索引是一个表,不需要包含任何列
  2. 是的,绝对
  3. 我不确定如果您询问切换本身的性能或者具有较小(或较少列)聚簇索引的性能影响,那么我将尝试回答这两个问题。
    • 切换自己。当您将聚簇索引切换到非群集时,我相信它不应该是昂贵的(我不认为引擎实际上会将块和扩展区混乱以构成堆)。绝对必须改变IAM,这需要时间。将非聚集索引更改为群集涉及更多活动。除了根据聚簇索引键移动数据外,SQLServer还必须更新所有非聚簇索引。
    • 进一步的影响(相当大的话题,我提出了一个非常简短的答案)...较小的聚簇索引意味着存储所有其他索引所需的空间更少,这反过来意味着更快地访问数据并减少引擎的资源消耗。 / LI>
  4. 更新我意识到(感谢 Aaron Bertrand 指出这一点)我对于将聚簇索引包含在非聚集索引中做了相当模糊的陈述。为了绝对正确,每个非聚集索引包括指向行的行定位器。当表是群集时,行定位器是聚簇索引键。 More info regarding clustered indexes