我读过排序数据文件(对于数据库表)中的记录按照与其对应的聚集索引中的键相同的顺序排序 - 并且聚集索引的叶节点包含对应于键的实际数据记录叶节点。
这是否意味着它们在物理上是相同的磁盘文件?
如果是,那么聚簇索引的树数据结构实际上是数据文件的物理部分吗?
如果不是,并且它们在物理上是独立的磁盘文件,那么叶节点是否包含指向数据记录的指针?-- 但这就是非聚集索引中发生的情况。
我找不到此查询的明确答案。请帮忙。
我读过排序数据文件(对于数据库表)中的记录按照与其对应的聚集索引中的键相同的顺序排序 - 并且聚集索引的叶节点包含对应于键的实际数据记录叶节点。
这是否意味着它们在物理上是相同的磁盘文件?
如果是,那么聚簇索引的树数据结构实际上是数据文件的物理部分吗?
如果不是,并且它们在物理上是独立的磁盘文件,那么叶节点是否包含指向数据记录的指针?-- 但这就是非聚集索引中发生的情况。
我找不到此查询的明确答案。请帮忙。
您将“数据文件”称为表的数据(实际行)在与其他表和索引分开的文件中。事实并非如此。我只想指出这一点,因为这可能是造成混淆的一个原因。
关于 SQL Server 物理结构的信息太多了,所以这将是非常简短的:
数据(松散地说)存储在数据库数据文件中的页面(8KB)块中。有不同类型的页面。
聚簇索引就是数据。即,该索引的叶级是实际行。它包含所有列,并且该索引的排序当然基于该聚集索引的索引键。没有其他地方/更远的地方可以“指出”。当您在树中导航时,现在位于 cl ix 的叶中,您确实位于数据行中。
另请注意,数据库的数据文件(.mdf、.ndf)(与事务日志文件 .ldf 相反)可以包含所有类型的页面。这包括用于非聚集索引的页面、用于聚集索引的页面、用于堆的页面(用于没有聚集索引的表的数据页面)等。
因此,在文件级别,“数据”和“索引”之间没有分离。在某种程度上,您可以使用文件组来实现这一点,但那是一个单独的主题。
另请注意,我小心翼翼地没有将聚簇索引与主键混淆。碰巧 PK 的默认索引类型是聚簇索引。但这只是默认设置。