<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
存储引擎揭秘:基本结构之三——区
原文地址:http://sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-an-extent.aspx
正文:
前面的文章我介绍了数据文件中的页,包括页结构和一些页类型。现在我想解释一下页是如何组织成区( extent )的。一个区是由数据文件中 8 个连续的页组成。区从数据文件头部开始,并且总是 64K 对齐(即: 8 页对齐)。区及其属性在 SQL SERVER 2000 和 2005 中是一模一样的。
SQL SERVER 中有两种类型的区:混合区和统一区。
混合区
分配给任意一条 IAM 链( SQL SERVER 2000 中的一个索引或者是 2005 中的分配单元)的前 8 个页的分配单位是单个页,这种页被称为混合页。就是说每次分配的是一个单独的页而不是一个区。这样便允许非常小的表花费最小数量的空间。一旦一条 IAM 链跨过了前 8 页的门槛,以后便分配统一区,再也不会分配混合页了。
从混合区中分配来的混合页,不需要分配给特定的 IAM 链。因为这些区会被全局分配跟踪(通过 GAM 页),所以不会分配给一个 IAM 链的。混合区中若还有没分配的页,该区同时会被 SGAM 页跟踪。当需要分配一个混合页,系统就会检查 SGAM 页是否还有这样的区。如果没有的话,就会分配一个新的混合区,并从中分配一页,然后这个区就被 SGAM 页跟踪直到所有的页被分配。
因为混合区不会被分配给一个特定的 IAM 链,这就是说它可能分配给 8 个不同的 IAM 链。不管有多少页被分配给 IAM 链, IAM 页本身总是混合页。这就是说一个混合区可有多种页类型,包括 IAM 页、数据页、索引页或文本页。
统一区
一旦跨过了 8 页的门槛,以后就从统一区上分配给 IAM 链了。这就是说一次分配一个区给一条 IAM 链,并在 IAM 链上的 IAM 页上标明——不管是谁映射该区所在的 GAM 区间的。该区同时会被相关的的 GAM 页跟踪是否已分配,这样其它的 IAM 链就不会再分配它了。
一个统一区的所有页必须分给同一条 IAM 链。然后,它们不需要是同一类型的页。比如,一个聚集索引会同时有数据和索引页。当一个区被分配给 IAM 链时,该区中的页并不是一次全被分配掉的(除非是大型数据操作),这些页通常是按需分配,每页的分配情况有 PFS 页跟踪。
当一个统一区的所有页都被释放,那么区本身就从拥有它的 IAM 链中释放了,并且可以再次分配给其他的 IAM 链,或者成为混合区。
为备份跟踪变化的区
系统中有两个地方用来跟踪变化的区:
1. 自上次完整备份以来所有改变的区会有相关的差异位图页( differential bitmap page )跟踪。这样差异备份时便可以知道哪些区需要备份而不是备份整个数据库了。当下次完整备份时所有的差异位图页都被复位。
2. 自上次完整、差异或日志备份以来一个区在 BULK-LOGGED 恢复模式下发生了大日志操作,会有相关的最小日志位图页( minimally-logged bitmap page )跟踪。大日志操作后的任何日志备份就会包含所有这些跟踪的区。当下次备份时,所有的最小日志位图页都会被复位。