非聚集索引中的行定位符

Posted

技术标签:

【中文标题】非聚集索引中的行定位符【英文标题】:Row Locator in Non Clustered Index 【发布时间】:2012-06-03 22:01:00 【问题描述】:

我正在阅读有关 Non Clustered Index 的内容,它说“Nonclustered 索引仅包含来自索引列和指向实际数据行的行定位器的值,而不是包含数据行本身。这意味着查询引擎必须采取额外的步骤才能找到实际数据。”

查询 - 我不清楚Row Locator。我假设它不是任何Primary key。背景中发生了与 Row-Locator 唯一标识行有关的事情。

【问题讨论】:

【参考方案1】:

如果表有唯一聚集索引,“行定位器”由聚集索引的列组成。

对于非唯一聚集索引,“行定位器”由聚集索引的列以及 SQL Server 添加的新字段以使引用唯一。新字段对用户不可见。它被称为“唯一符”,由四个字节组成。

没有聚集索引(又名堆)的表中,“行定位器”是 RID 或行标识符。 RID 指向一个物理位置。它由文件标识符(ID)、页码和页面上的行号组成。

“行定位器”的一个实际结果是,为具有大量索引的表设置一个小的主键是有意义的 :) Full details on this MSDN page.

【讨论】:

@PankajGarg:实际上是clustered index,参见MSDN:“如果在表上定义了聚集索引,非聚集索引总是包含聚集索引列。” 在收集行定位器的主键列信息时是否包括任何优先级?我问这个是因为,我可以有 Primary/Alternate/Candidate 键,所有这些唯一地标识行。【参考方案2】:

@Nilish:“候选键”是您在决定将哪些列用作主键时使用的术语。而 SQL 对此一无所知。我不知道“备用键”是什么意思,只是它是另一组可能用于主键的列。

因此,SQL 中没有这些“优先级”的概念。 SQL 不知道哪些列唯一标识记录,直到您通过创建主键告诉它。一旦定义了键,SQL 就会使用它们。

一个表要么没有索引(堆),要么没有唯一的聚集索引,或者有唯一的聚集索引。没有其他可能性。 (主键通常是唯一的聚集索引。)

【讨论】:

以上是关于非聚集索引中的行定位符的主要内容,如果未能解决你的问题,请参考以下文章

了解聚集索引

聚集索引非聚集索引

07.索引-非聚集索引-Key Lookup &RID Lookup

Mysql 索引实现原理. 聚集索引, 非聚集索引

学习笔记——数据库存储结构:页聚集索引非聚集索引

08.索引-非聚集索引-联合索引覆盖索引