索引基本上是表的副本吗?

时间:2018-07-09 10:28:23

标签: sql sql-server indexing database-indexes

今天,我去了一次工作面试,当时我在那儿听说“索引从本质上讲是表的克隆体,它们是根据它们制成的”。

有人可以和这句话联系起来吗?老实说,我从未听说过这种索引定义

2 个答案:

答案 0 :(得分:2)

不是,虽然可以。

每个索引(包括聚集索引)将在其所有内部节点中使用索引 keys 。不同之处在于,当我们到达索引的时会发生什么。

在SQL Server中的常规老式非聚集索引中,您将在叶子中找到聚集索引(或堆表的某种形式的行ID)的键值。而在聚簇索引中,您将找到所有列的值,而不仅仅是聚簇键的值(对于该索引)是特定的键。

索引中的

INCLUDE通过在非聚簇索引中包括叶级的额外列而使水有些混乱。

如果非聚集索引的总列集(索引键,聚集索引键,包含的列)与表中所有列的集合相同,则在某种程度上,非聚集索引似乎确实是表的副本-至少在某种程度上,使用此索引的任何查询都不必执行任何表查询即可检索所有数据。

如果上面的列集与表中所有列的集不同,则它不是表的副本。它是表中列的子集的副本。当然,如果此列子集是特定查询所需的所有列,那么仍然可以避免表查找。

答案 1 :(得分:1)

如果您谈到聚集索引,那么它是正确的。只需检查文档:

  

聚集索引对数据行进行排序并将其存储在表或视图中   根据其关键值。这些是索引中包含的列   定义。每个表只能有一个聚集索引,因为   数据行本身只能以一种顺序存储。

     

表中的数据行唯一按排序顺序存储的时间是   当表包含聚集索引时。当一个表有一个   聚簇索引,该表称为聚簇表。如果一个表有   没有聚簇索引,其数据行存储在无序结构中   叫做堆。

但是,如果您谈论的是非聚集索引,那么它是错误的coz表存储,因为它是堆,并且索引与表分开。在这种情况下,索引是另一个看起来像数据结构的对象。

  

非聚集索引的结构与数据行分开。一种   非聚集索引包含非聚集索引键值,每个   键值条目具有指向包含键的数据行的指针   值。

     

从非聚集索引中的索引行到数据行的指针是   称为行定位器。行定位器的结构取决于   数据页存储在堆还是集群表中。对于   堆,行定位器是指向该行的指针。对于群集表,   行定位符是聚簇索引键。

     

您可以将非键列添加到非聚集索引的叶级别   绕过现有的索引键限制,并执行完全涵盖的内容,   索引,查询。有关更多信息,请参见使用以下内容创建索引   包含的列。有关索引键限制的详细信息,请参见最大值   SQL Server的容量规格。