今天,我去了一次工作面试,当时我在那儿听说“索引从本质上讲是表的克隆体,它们是根据它们制成的”。
有人可以和这句话联系起来吗?老实说,我从未听说过这种索引定义
答案 0 :(得分:2)
不是,虽然可以。
每个索引(包括聚集索引)将在其所有内部节点中使用索引 keys 。不同之处在于,当我们到达索引的叶时会发生什么。
在SQL Server中的常规老式非聚集索引中,您将在叶子中找到聚集索引(或堆表的某种形式的行ID)的键值。而在聚簇索引中,您将找到所有列的值,而不仅仅是聚簇键的值(对于该索引)是特定的键。
索引中的 INCLUDE
通过在非聚簇索引中包括叶级的额外列而使水有些混乱。
如果非聚集索引的总列集(索引键,聚集索引键,包含的列)与表中所有列的集合相同,则在某种程度上,非聚集索引似乎确实是表的副本-至少在某种程度上,使用此索引的任何查询都不必执行任何表查询即可检索所有数据。
如果上面的列集与表中所有列的集不同,则它不是表的副本。它是表中列的子集的副本。当然,如果此列子集是特定查询所需的所有列,那么仍然可以避免表查找。
答案 1 :(得分:1)
如果您谈到聚集索引,那么它是正确的。只需检查文档:
聚集索引对数据行进行排序并将其存储在表或视图中 根据其关键值。这些是索引中包含的列 定义。每个表只能有一个聚集索引,因为 数据行本身只能以一种顺序存储。
表中的数据行唯一按排序顺序存储的时间是 当表包含聚集索引时。当一个表有一个 聚簇索引,该表称为聚簇表。如果一个表有 没有聚簇索引,其数据行存储在无序结构中 叫做堆。
但是,如果您谈论的是非聚集索引,那么它是错误的coz表存储,因为它是堆,并且索引与表分开。在这种情况下,索引是另一个看起来像数据结构的对象。
非聚集索引的结构与数据行分开。一种 非聚集索引包含非聚集索引键值,每个 键值条目具有指向包含键的数据行的指针 值。
从非聚集索引中的索引行到数据行的指针是 称为行定位器。行定位器的结构取决于 数据页存储在堆还是集群表中。对于 堆,行定位器是指向该行的指针。对于群集表, 行定位符是聚簇索引键。
您可以将非键列添加到非聚集索引的叶级别 绕过现有的索引键限制,并执行完全涵盖的内容, 索引,查询。有关更多信息,请参见使用以下内容创建索引 包含的列。有关索引键限制的详细信息,请参见最大值 SQL Server的容量规格。