【发布时间】:2012-04-16 10:58:59
【问题描述】:
您能解释一下 SQL 中“Extent”和“Allocation Unit”之间的区别或关系吗?
【问题讨论】:
标签: sql sql-server sql-server-2008 indexing
您能解释一下 SQL 中“Extent”和“Allocation Unit”之间的区别或关系吗?
【问题讨论】:
标签: sql sql-server sql-server-2008 indexing
每个对象(无论是索引还是堆)都有多个分区(1-15k)。每个分区可以有三个不同的分配单元,即存储实际数据的 HoBT(堆或 b-tree,也称为 hobbit)。 LOB 类型的 LOB ALU 以及行溢出数据的 SLOB ALU。
页面属于某个分配单元。所有页面都属于一个范围 - 一组 8 个页面。虽然各个页面可以属于不同的分配单元,但它们始终属于统一范围内的同一个对象 - 而混合范围包含用于不同对象和可能不同分配单元的页面。
【讨论】:
分配单元基本上只是一组页面。它可以很小(一页)或很大(很多很多页)。它在sys.allocation_units 中有一个元数据条目。它由IAM chain 跟踪。分配单元最常见的用途是行集的 3 个众所周知的 AU:IN_ROW_DATA、ROW_OVERFLOW 和 LOB_DATA。
一个范围是任何 8 个连续的页面,从一个可被 8 整除的页面 ID 开始。SQL Server IO 以一种范围感知的方式执行:理想情况下一次读入整个范围,一次写出整个范围。这取决于缓冲池的当前状态,详情请参阅How It Works: Bob Dorr's SQL Server I/O Presentation。 Extents 通常是一起分配的,因此一个extent 的所有页都属于同一个分配单元。但是由于这会导致小表的过度分配,一种特殊类型的范围是所谓的“混合”范围,其中每个页面都可以属于一个单独的分配单元。详情见Inside The Storage Engine: GAM, SGAM, PFS and other allocation maps。
因此,正如您所见,这些概念是相关的,但非常不同。也许您应该解释一下您要解决的问题是什么,或者您为什么对这些概念感兴趣,也许我们可以再详细说明。