首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚集和非聚集索引大数据插入

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

Stack Overflow用户
提问于 2013-06-08 20:57:13
回答 1查看 1.6K关注 0票数 1

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

  1. 当使索引聚集(基本上删除并重新创建索引为clustered)时,我不需要正确的include (任何列),因为这是聚集的吗?
  2. 一般情况下,我将较少的列索引切换为聚集,并将大列聚集索引更改为非聚集索引,这通常正确吗?换句话说,聚集索引应该是简单而小的吗?
  3. 如果切换这两个索引,是否存在性能问题?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-08 21:28:16

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

  1. 没错,聚集索引是一个表,不需要包含任何列
  2. 是的,绝对
  3. 如果您问的是切换自身的性能,还是使用更小(或更少列)聚集索引对性能的影响,那么我将尝试同时回答这两个问题。
    • 自动切换。当您将聚集索引切换到非聚集索引时,我认为它不应该很昂贵(我不认为引擎实际上会对块和区段进行洗牌以生成堆)。当然,我必须改变,这将需要时间。将非聚集索引改为聚集索引涉及更多的活动。除了根据聚集索引键移动数据外,SQLServer还必须更新所有非聚集索引。
    • 进一步的影响(相当大的话题,我提出了一个非常简短的答案).较小的聚集索引意味着存储所有其他索引所需的空间更少,这反过来意味着更快地访问数据和减少引擎的资源消耗。

Update我意识到(感谢Aaron 指出了这一点),我在包含聚集索引到非聚集索引方面做了相当含糊的声明。要做到绝对正确,每个非聚集索引都包括指向行的行定位器。当表被聚集时,行定位器是聚集索引键。关于聚集索引的更多信息:[1](https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms190639(v=sql.105%29)[2] )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17003779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档