非聚集索引中的行定位符
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 就会使用它们。
一个表要么没有索引(堆),要么没有唯一的聚集索引,或者有唯一的聚集索引。没有其他可能性。 (主键通常是唯一的聚集索引。)
【讨论】:
以上是关于非聚集索引中的行定位符的主要内容,如果未能解决你的问题,请参考以下文章