clustered
a和 a 有什么区别non-clustered index
?
13 回答
聚集索引
- 每桌只有一个
- 由于数据以索引顺序物理存储,因此读取速度比非集群更快
非聚集索引
- 每桌可多次使用
- 插入和更新操作比聚集索引更快
Both types of index will improve performance when select data with fields that use the index but will slow down update and insert operations.
由于插入和更新速度较慢,因此应在通常为增量的字段(即 Id 或时间戳)上设置聚集索引。
SQL Server 通常仅在其选择性高于 95% 时才使用索引。
聚集索引对磁盘上的数据进行物理排序。这意味着索引不需要额外的数据,但只能有一个聚集索引(显然)。使用聚集索引访问数据是最快的。
所有其他索引必须是非聚集的。非聚集索引具有来自索引列的数据的副本,这些数据与指向实际数据行的指针一起保持有序(如果存在则指向聚集索引的指针)。这意味着通过非聚集索引访问数据必须经过一个额外的间接层。但是,如果您仅选择索引列中可用的数据,您可以直接从重复的索引数据中获取数据(这就是为什么最好只选择您需要的列而不使用 *)
聚集索引物理存储在表上。这意味着它们是最快的,每个表只能有一个聚集索引。
非聚集索引是单独存储的,您可以拥有任意数量的索引。
最好的选择是在最常用的唯一列上设置聚集索引,通常是 PK。您的表中应该始终有一个精心选择的聚集索引,除非有非常令人信服的理由——想不出一个,但是嘿,它可能就在那里——因为不这样做会出现。
聚集索引
- 一张表只能有一个聚集索引。
- 通常在主键上进行。
- 聚集索引的叶节点包含数据页。
非聚集索引
- 一个表只能有 249 个非聚集索引(直到 sql 版本 2005 以后的版本最多支持 999 个非聚集索引)。
- 通常在任何键上进行。
- 非聚集索引的叶节点不包含数据页。相反,叶节点包含索引行。
聚集索引
- 一张表中只能有一个聚集索引
- 对记录进行排序并按照顺序进行物理存储
- 数据检索比非聚集索引更快
- 不需要额外的空间来存储逻辑结构
非聚集索引
- 一个表中可以有任意数量的非聚集索引
- 不影响物理顺序。为数据行创建逻辑顺序并使用指向物理数据文件的指针
- 数据插入/更新比聚集索引快
- 使用额外的空间来存储逻辑结构
除了这些差异之外,您必须知道当表是非聚集的(当表没有聚集索引时)数据文件是无序的并且它使用堆数据结构作为数据结构。
优点:
聚集索引适用于范围(例如 select * from my_table where my_key between @min 和 @max)
在某些情况下,如果您使用 orderby 语句,DBMS 将不必进行排序工作。
缺点:
聚集索引可能会减慢插入速度,因为如果新键不按顺序排列,则必须在放入记录时修改记录的物理布局。
集群基本上意味着数据在表中的物理顺序。这就是为什么每张桌子只能有一个。
非聚集意味着它“仅”是一个逻辑顺序。
聚集索引实际上描述了记录物理存储在磁盘上的顺序,因此您只能拥有一个。
非聚集索引定义了与磁盘上的物理顺序不匹配的逻辑顺序。
索引数据库有两部分:一组以任意顺序排列的物理记录,以及一组索引,这些索引标识应读取记录以产生按某种标准排序的结果的顺序。如果物理排列和索引之间没有关联,那么按顺序读取所有记录可能需要进行大量独立的单记录读取操作。因为一个数据库可能能够在比读取两个不连续记录的时间更短的时间内读取数十个连续记录,如果索引中连续的记录也连续存储在磁盘上,则性能可能会有所提高。
例如,如果从一个空的非集群数据库开始并以随机顺序添加 10,000 条记录,则这些记录可能会按照添加顺序添加到末尾。按索引顺序读取数据库需要 10,000 次单记录读取。但是,如果要使用集群数据库,系统可能会在添加每条记录时检查之前的记录是否是自己存储的;如果发现是这种情况,它可能会将该记录与数据库末尾的新记录一起写入。然后,它可以查看移动记录所在的插槽之前的物理记录,并查看后面的记录是否由它自己存储。如果发现是这种情况,它可以将该记录移至该位置。使用这种方法会导致许多记录成对组合在一起,
实际上,集群数据库使用比这更复杂的算法。但是,需要注意的关键是在更新数据库所需的时间和顺序读取数据库所需的时间之间进行权衡。维护集群数据库将显着增加以任何会影响排序顺序的方式添加、删除或更新记录所需的工作量。如果数据库被顺序读取的频率比更新的频率高得多,那么集群可能是一个巨大的胜利。如果它会经常更新但很少按顺序读取,则集群可能会消耗很大的性能,特别是如果将项目添加到数据库的顺序与它们相对于集群索引的排序顺序无关。
聚集索引本质上是索引列中数据的排序副本。
聚集索引的主要优点是,当您的查询(查找)在索引中定位数据时,不需要额外的 IO 来检索该数据。
维护聚集索引的开销,尤其是在频繁更新的表中,可能会导致性能下降,因此最好创建非聚集索引。
// 抄自MSDN,非聚集索引的第二点在其他答案中没有明确提到。
集群的
- 聚集索引根据键值对表或视图中的数据行进行排序和存储。这些是索引定义中包含的列。每个表只能有一个聚集索引,因为数据行本身只能以一种顺序存储。
- 表中的数据行按排序顺序存储的唯一时间是表包含聚集索引时。当表具有聚集索引时,该表称为聚集表。如果表没有聚集索引,则其数据行存储在称为堆的无序结构中。
非聚集
- 非聚集索引具有与数据行分开的结构。非聚集索引包含非聚集索引键值,
每个键值条目都有一个指向包含键值的数据行的指针。 - 从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位符是聚集索引键。
聚集索引
- 聚集索引的检索速度更快,而插入和更新速度较慢。
- 一张表只能有一个聚集索引。
- 不需要额外的空间来存储逻辑结构。
- 确定数据在磁盘上的存储顺序。
非聚集索引
非聚集索引检索数据的速度较慢,而插入和更新的速度较快。
一个表可以有多个非聚集索引。
需要额外的空间来存储逻辑结构。
对磁盘上存储数据的顺序没有影响。