a clustered
和a有non-clustered index
什么区别?
a clustered
和a有non-clustered index
什么区别?
Answers:
聚集索引
非聚集索引
当选择具有使用索引的字段的数据时,两种类型的索引都将提高性能,但是会减慢更新和插入操作的速度。
由于插入和更新的速度较慢,因此应在通常为增量的字段(即Id或Timestamp)上设置聚集索引。
如果SQL Server的选择性高于95%,则通常只使用索引。
聚集索引对磁盘上的数据进行物理排序。这意味着索引不需要额外的数据,但是(显然)只能有一个聚集索引。使用聚簇索引访问数据最快。
所有其他索引都必须是非聚集的。非聚集索引具有索引列中数据的重复副本,这些数据保持有序排列,并带有指向实际数据行的指针(指向聚集索引的指针,如果有的话)。这意味着通过非聚集索引访问数据必须经过一个间接层。但是,如果只选择索引列中可用的数据,则可以直接从重复的索引数据中获取数据(这就是为什么只选择需要的列而不使用*的一个好主意)
除了这些差异之外,您还必须知道,当非聚集表时(当表没有聚簇索引时)数据文件是无序的,并且使用堆数据结构作为数据结构。
优点:
聚集索引非常适合范围(例如,从my_table中选择*,其中my_key在@min和@max之间)
在某些情况下,如果您使用orderby语句,则DBMS不必进行排序。
缺点:
聚簇索引会降低插入速度,因为如果新键的顺序不正确,则在插入记录时必须修改记录的物理布局。
索引数据库分为两部分:一组物理记录,以任意顺序排列;一组索引,标识应读取记录的顺序以产生按某种标准排序的结果。如果物理排列和索引之间没有相关性,那么按顺序读出所有记录可能需要进行许多独立的单记录读取操作。因为与读取两个非连续记录相比,数据库可以在更少的时间内读取数十个连续记录,所以如果索引中连续的记录也连续存储在磁盘上,则可以提高性能。
例如,如果要从一个空的非集群数据库开始并以随机顺序添加10,000条记录,则记录可能会按照添加顺序的末尾添加。按索引顺序读出数据库将需要10,000次单记录读取。但是,如果要使用群集数据库,则系统可能会在添加每条记录时检查以前的记录是否由其自身存储;如果发现确实如此,则可以在数据库末尾用新记录写该记录。然后,它可以查看移动记录以前所在的插槽之前的物理记录,并查看其后的记录是否由自身存储。如果发现确实如此,则可以将该记录移至该位置。使用这种方法会导致许多记录成对分组,
实际上,集群数据库使用的算法要比这复杂得多。但是要注意的关键是,在更新数据库所需的时间与顺序读取数据库所需的时间之间需要权衡。维护集群数据库将显着增加以任何可能影响排序顺序的方式添加,删除或更新记录所需的工作量。如果顺序读取数据库的频率比更新顺序读取的频率高,那么集群将是一个大赢家。如果将经常对其进行更新但很少按顺序进行读取,则聚类可能会浪费大量的性能,尤其是如果将项目添加到数据库的顺序与聚簇索引的排序顺序无关。
您可能已经阅读了以上文章中的理论部分:
-如我们所见,聚集索引直接指向要记录的点,即它的直接索引,因此搜索所需的时间更少。此外,将不需要任何额外的内存/空间来存储索引
-虽然在非聚集索引中,它间接指向聚集索引,然后它将访问实际记录,由于其间接性质,将需要花费更多的时间来访问它,而且它需要自己的内存/空间来存储指数
//从MSDN复制,非聚集索引的第二点未在其他答案中明确提及。
聚类
非集群