无法直接访问集群表中的数据行 - 为什么?

时间:2010-10-29 05:18:02

标签: sql-server database performance database-design indexing

[11]告诉:

  

在非聚簇索引中,叶级别不包含所有数据。除了键值之外,叶级别中的每个索引行(树的最低级别)包含一个告诉SQL Server在哪里找到与索引中的键对应的数据行的书签   书签可以采用两种形式之一。 如果表具有聚簇索引,则书签是相应数据行的聚簇索引键
  。如果表是堆(换句话说,它没有聚簇索引),则书签是行标识符(RID),它是File#:Page#:Slot#。形式的实际行定位器。

这是聚簇索引键或非聚簇索引的副本有指针吗?

是否应遍历所有聚簇索引结构,即带有中间数据的b-tree,以通过聚簇表上的非聚集索引书签获取行数据?

聚集索引是什么引入直接引用变得不可能?


更新
让我重新说一下这个问题。如何做到这一点我可以自己阅读,但我想了解为什么这样做。

继续通过RID从具有(已添加)群集索引的非群集索引引用行数据会不会更有效率?

假设一个表只有非聚集索引(但没有聚簇索引) 非聚集索引叶包含实际数据的RID。用于直接访问行数据而无需查找/遍历。

添加聚簇索引意味着消除IAM(索引分配映射)页面并用聚簇索引键替换所有非聚集索引的所有RID +额外查找的必要性而不是直接访问。
这有什么意义?

UPDATE2:
我的问题被微软本人贬低了吗?再次感谢,这是一种荣誉 没有解释就没有意义。

UPDATE3:
@PerformanceDB“,我无法理解你答案中的短语:

  

“”这也意味着B-Tree在索引高度上减少了一个级别(这就是为什么它们在检查它们时很小)。“

你可以解释一下吗?

是的,我想要插图。

我开始阅读:Debunking myths about clustered indexes - part 4 (CIXs, TPC-C & Oracle clusters),正如许多其他来源一样,它明确提到了这样一个事实,即与Oracle相比,SQL Server缺乏集群表上的直接访问功能。

Update4(Update5 - 通过删除校正):
一些回答者提到NCI叶子中的书签CI密钥在页面拆分的情况下用于地址独立的事实。

在使用 CI NCI(非聚集索引)的非聚集表中进行索引重组或解冻时,重新定位的行和NCI中的相应RID 在NCI中更改被修改?

在我看来这是解决方案的不足之处 - 这行应该随着它的地址而移动,应该没有呢? 堆,完全不受页面拆分的影响吗?由于行中可变大小数据类型的大小增加


相关问题:


[11]
Microsoft®SQLServer™2005内部:存储引擎
作者:Kalen Delaney - (固体素质学习)
...............................................
出版商:微软出版社
发布日期:2006年10月11日
打印ISBN-10:0-7356-2105-5
打印ISBN-13:978-0-7356-2105-3
页数:464

[11A] p.250章节索引组织来自第7章。索引内部和管理

这是有用的在线copypaste从它 http://sqlserverindexeorgnization.blogspot.com/

虽然没有任何信用来源

6 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

  

让我重新说一下这个问题。怎么样   这样做我可以读自己,但我   想要明白为什么要这样做   方式。

     

它不会更有效率   继续通过RID引用行数据   来自非聚集索引   (已添加)群集?

NO!如果某个表有插入,并且发生了页面拆分,那么您可能必须更新许多使用RID指向这些数据行的新位置的引用已被移动到SQL Server中的新页面。这就是为什么 SQL Server团队选择使用集群密钥作为“数据指针”,可以这么说。发生页面拆分时,聚类键的值不会更改,因此不需要更新索引。

答案 2 :(得分:2)

  

继续通过RID从具有(已添加)群集索引的非群集索引引用行数据会不会更有效率?

聚集索引的重点是通过逻辑定位器(通常不会改变)访问记录,而不是物理。

如果索引指向物理RID并且某行更改了其物理位置(例如来自页面拆分),则所有索引也需要更新。

这正是发明聚簇索引所要解决的问题。

答案 3 :(得分:1)

如果表具有聚簇索引,则每个非聚簇索引行都包含聚簇索引键的副本。

如果表没有聚簇索引,即表是堆,则每个非聚簇索引行包含根据文件标识符(ID),页码和页面上行号构建的指针。整个指针称为行ID(RID)。

使用聚簇索引识别(选择)行时,您将拥有该行中的所有列。 当您在非聚集索引中标识行时,需要执行另一个查找步骤以获取未包含在非聚集索引中的列。

答案 4 :(得分:1)

  

它不会更有效率   继续通过RID引用行数据   来自非聚集索引   (已添加)群集?

在许多情况下,效率更高,是的。我认为聚集索引最初是以这种方式实现的(在6.0版本中)。据推测,由于marc_s提到的原因,它们已被更改,如果您的聚簇索引具有大量页面拆分,则这是有意义的。

答案 5 :(得分:0)

我不会发布这个(我的)问题,我在发布之前看过that answer by AlexSmith there,我在发布后几分钟就看到了这个问题,并且已经在这里回答:

很可惜,这里不可能接受它作为答案

更新:
accepted here answer by PerformanceDBA告诉:“问题是doco是gobbledegook,并且增加了它声称它澄清的混乱”

好吧,所有msdn文档告诉并显示,例如,cf。来自Clustered Index Structures"Heap Structures"的图片集群表没有IAM页面。同时,来自Inside the Storage Engine: Using DBCC PAGE and DBCC IND to find out if page splits ever roll back的代码的输出显示相反的结果。

我不想在这里继续发送垃圾邮件,而是将我的提问和参与转移到/www.sqlservercentral.com/Forums

我的相关问题: