群集索引和非群集索引之间有什么区别?

时间:2008-09-18 11:14:23

标签: sql-server indexing clustered-index non-clustered-index

clusterednon-clustered index之间有什么区别?

13 个答案:

答案 0 :(得分:246)

聚集指数

  • 每张桌子只有一个
  • 读取速度比非聚集读取速度快,因为数据按索引顺序物理存储

非聚集指数

  • 每张桌子可以多次使用
  • 插入和更新操作比聚簇索引更快

当选择包含使用索引的字段但会减慢更新和插入操作的数据时,这两种类型的索引都会提高性能。

由于插入和更新速度较慢,应在通常为增量的字段(即Id或时间戳)上设置聚簇索引。

如果索引的选择性高于95%,SQL Server通常只会使用索引。

答案 1 :(得分:69)

群集索引在物理上对磁盘上的数据进行排序。这意味着索引不需要额外的数据,但只能有一个聚簇索引(显然)。使用聚簇索引访问数据的速度最快。

所有其他索引必须是非群集的。非聚集索引具有与保持有序的索引列一起的数据的副本以及指向实际数据行的指针(如果存在,则指向聚簇索引的指针)。这意味着通过非聚集索引访问数据必须经过额外的间接层。但是,如果仅选择索引列中可用的数据,则可以直接从重复的索引数据中获取数据(这就是为什么最好只选择所需的列而不使用*)

答案 2 :(得分:32)

聚簇索引物理存储在表中。这意味着它们是最快的,每个表只能有一个聚簇索引。

非聚集索引是单独存储的,您可以拥有任意数量的索引。

最好的选择是在最常用的唯一列上设置聚簇索引,通常是PK。你应该总是在你的表中有一个精心挑选的聚集索引,除非有一个非常令人信服的理由 - 不能想到一个,但嘿,它可能在那里 - 因为没有这样做。

答案 3 :(得分:26)

聚集索引

  1. 表格只能有一个聚集索引。
  2. 通常在主键上制作。
  3. 聚簇索引的叶节点包含数据页。
  4. 非聚集索引

    1. 一个表只能有249个非聚簇索引(直到sql版本2005更高版本支持最多999个非聚簇索引)。
    2. 通常在任意键上制作。
    3. 非聚簇索引的叶节点不包含数据页。相反,叶节点包含索引行。

答案 4 :(得分:22)

聚集索引

  • 表中只能有一个聚簇索引
  • 对记录进行排序并根据订单实际存储
  • 数据检索比非聚集索引更快
  • 不需要额外的空间来存储逻辑结构

非聚集指数

  • 表中可以有任意数量的非聚集索引
  • 不影响身体秩序。为数据行创建逻辑顺序并使用指向物理数据文件的指针
  • 数据插入/更新比聚集索引
  • 更快
  • 使用额外空间存储逻辑结构

除了这些差异之外,您还必须知道当表是非群集的时(当表没有聚簇索引时),数据文件是无序的,并且它使用堆数据结构作为数据结构。

答案 5 :(得分:8)

Clustered基本上意味着数据在表中的那个phisical顺序。这就是为什么每桌只能有一个。

Unclustered意味着它“仅”是一个逻辑顺序。

答案 6 :(得分:6)

优点:

群集索引适用于范围(例如,从my_table中选择*,其中@min和@max之间的my_key)

在某些情况下,如果您使用orderby语句,DBMS将不必进行排序。

缺点:

聚簇索引可能会降低插入速度,因为如果新密钥不是按顺序排列,则必须在记录放入时修改记录的物理布局。

答案 7 :(得分:5)

聚集索引实际上描述了记录物理存储在磁盘上的顺序,因此您只能拥有一个。

非群集索引定义了与磁盘上的物理顺序不匹配的逻辑顺序。

答案 8 :(得分:5)

聚簇索引本质上是索引列中数据的排序副本。

聚簇索引的主要优点是,当您的查询(搜索)在索引中查找数据时,不需要额外的IO来检索该数据。

维护聚簇索引的开销,特别是在频繁更新的表中,可能会导致性能不佳,因此最好创建一个非聚集索引。

答案 9 :(得分:5)

索引数据库有两部分:一组物理记录,按任意顺序排列;一组索引,用于标识应读取记录的顺序,以产生按某些标准排序的结果。如果物理排列和索引之间没有相关性,那么按顺序读出所有记录可能需要进行大量独立的单记录读取操作。因为数据库可以在比读取两个非连续记录所花费的时间更短的时间内读取数十个连续记录,所以如果索引中连续的记录也连续存储在磁盘上,则可以提高性能。指定索引是群集的将导致数据库做出一些努力(不同的数据库有多少不同)来安排事情,以便索引中连续的记录组将在磁盘上连续。

例如,如果要以空的非群集数据库开始并按随机顺序添加10,000条记录,则记录可能会按添加顺序添加到最后。按索引按顺序读出数据库需要10,000个单记录读取。但是,如果要使用群集数据库,系统可能会检查添加每条记录的时间是否自己存储了以前的记录;如果发现是这种情况,它可能会在数据库末尾用新的记录写下该记录。然后,它可以在移动的记录用于驻留的插槽之前查看物理记录,并查看随后的记录是否由其自身存储。如果发现是这种情况,它可以将该记录移动到该位置。使用这种方法会导致许多记录成对组合在一起,因此可能几乎使顺序读取速度加倍。

实际上,群集数据库使用比这更复杂的算法。但需要注意的一点是,在更新数据库所需的时间与按顺序读取数据库所需的时间之间存在权衡。维护群集数据库将显着增加以任何可能影响排序顺序的方式添加,删除或更新记录所需的工作量。如果按顺序读取数据库的次数比更新次数要多,则群集可能是一个很大的胜利。如果它经常更新但很少按顺序读出,则群集可能是一个很大的性能消耗,特别是如果项目添加到数据库的顺序与它们关于聚簇索引的排序顺序无关。

答案 10 :(得分:0)

//从MSDN复制,在其他答案中未明确提及非聚集索引的第二点。

集群

  • 聚簇索引对数据行进行排序并将其存储在表或视图中 根据其关键值。这些是包含在 索引定义。每个表只能有一个聚集索引, 因为数据行本身只能以一种顺序存储。
  • 表中的数据行仅按排序顺序存储的时间是 当表包含聚集索引时。当一个表有一个 聚簇索引,该表称为聚簇表。如果一张桌子 没有聚集索引,其数据行以无序存储 结构称为堆。

已取消

  • 非聚集索引的结构与数据行分开。一种 非聚集索引包含非聚集索引键值和
    每个键值条目都有一个指向数据行的指针,该数据行包含 键值。
  • 从非聚集索引中的索引行到数据行的指针 被称为行定位器。行定位器的结构取决于 数据页存储在堆还是集群表中。 对于堆,行定位器是指向该行的指针。对于集群 表中,行定位符是聚簇索引键。

答案 11 :(得分:0)

您可能已经阅读了以上文章中的理论部分:

-如我们所见,聚集索引可以直接记录点,即直接记录,因此搜索所需的时间更少。此外,将不需要任何额外的内存/空间来存储索引

-在非聚集索引中,它间接指向聚集索引,然后它将访问实际记录,由于其间接性质,将需要更多的时间来访问它也需要它自己的用于存储索引的内存/空间

enter image description here

答案 12 :(得分:0)

聚集索引

  • 聚簇索引检索速度更快,插入速度更慢 并更新。
  • 一张表只能有一个聚集索引。
  • 不需要额外的空间来存储逻辑结构。
  • 确定在磁盘上存储数据的顺序。

非聚集索引

  • 非聚集索引检索数据较慢,但检索速度较快 插入和更新。

  • 一个表可以有多个非聚集索引。

  • 需要额外的空间来存储逻辑结构。

  • 对磁盘上存储数据的顺序没有影响。