聚集索引和创建它的表是不是都包含实际数据?

Posted

技术标签:

【中文标题】聚集索引和创建它的表是不是都包含实际数据?【英文标题】:Do Clustered Index and the table on which it is created both contain the actual data?聚集索引和创建它的表是否都包含实际数据? 【发布时间】:2015-04-14 12:08:47 【问题描述】:

聚集索引根据键值对表或视图中的数据行进行排序和存储。

https://msdn.microsoft.com/en-IN/library/ms190457.aspx

这意味着如果一个表有聚集索引,那么该表的行将按照与聚集索引完全相同的顺序存储在磁盘上。

其次,聚集索引的叶节点包含创建它的表的数据页。

https://technet.microsoft.com/en-us/library/ms177443%28v=sql.105%29.aspx

那么,我的问题是相同的数据存储在聚集索引和创建它的表中?

如果是,那么需要按照与聚集索引相同的顺序对表进行排序吗?因为聚集索引本身将行级数据存储在它的叶子节点中。

如果不是,那么创建聚集索引背后的实际理论是什么?

【问题讨论】:

【参考方案1】:

数据存储在聚集索引的叶级 - 表数据!

它没有存储在表中聚集索引中 - 聚集索引的叶级表格数据。

【讨论】:

您写道,“聚集索引的叶级数据是表数据。”这是什么意思?据我了解,这意味着聚集索引的叶节点指向表的实际行。但是根据聚集索引的定义,“聚集索引不存储指向实际行的指针。实际上,这就是聚集索引和非聚集索引之间的区别。非聚集索引既存储值又存储指向保存该值的实际行。聚集索引不存储指向实际行的指针。聚集索引实际上将行级数据存储在其叶节点中。 @user1780538:不,聚集索引的叶级不存储指向数据的指针 - IT IS THE DATA! 叶级聚集索引的节点包含每个条目的所有列数据。非聚集索引包含索引列、任何可能的包含列、和聚集键(作为数据的“指针”) @user1780538:另请参阅Effective Clustered Indexes 以获得深入的解释(包括一些显示正在发生的事情的图形)【参考方案2】:

我在这里得到了答案: https://www.youtube.com/watch?v=lYsVOB_A5o4

https://www.simple-talk.com/sql/performance/14-sql-server-indexing-questions-you-were-too-shy-to-ask/

聚集索引不是表的独立索引,它就是表。 聚集索引不像其他索引类型那样是一个单独的实体,而是一种用于对表进行排序和促进快速数据访问的机制。

因此,我们可以说数据存储在聚集索引中或数据存储在表中。两者都是一样的。

【讨论】:

以上是关于聚集索引和创建它的表是不是都包含实际数据?的主要内容,如果未能解决你的问题,请参考以下文章

数据库怎样创建一个唯一聚集索引

非聚集索引中的行定位符

索引视图的两列上的唯一聚集索引

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

选择啥列来创建聚集索引

聚集索引非聚集索引