设为首页 收藏本站
查看: 1390|回复: 0

[经验分享] 【转】SQL Server 存储:理解IAM 页

[复制链接]

尚未签到

发表于 2017-12-13 20:28:08 | 显示全部楼层 |阅读模式
  原文地址:http://www.cnblogs.com/woodytu/p/4488930.html
  在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页。今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页。
  在SQL Server 2005和以后的版本里,分配单元(allocation units)以下三个类型:


  •   IN_ROW_DATA
      用于存储堆分区或索引分区,即heap和B-tree。

  •   LOB_DATA
      用于存储大型对象 (LOB) 数据类型,例如 xml、varbinary(max) 和 varchar(max)。

  •   ROW_OVERFLOW_DATA
      用于存储超过 8,060 字节行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中存储的可变长度数据。

  在我们讨论GAM和SGAM页时,我们注意到,一个GAM页可以跟踪4GB的空间并每4GB空间增加一个GAM页。一个IAM页是用来跟踪,表的指定分配单元,在分区的GAM区间里,页或区的分配情况。让我们通过实例来演示下。
  我们创建一个包含3列varchar(3000)数据类型和1列LOB数据类型,还有一列INT数据类型的表。这样我们的表就包含里三类分配单元。

DSC0000.gif   

1 USE InternalStorageFormat  2 GO
  3
  4 CREATE TABLE IAMTable(
  5>  6 col1 VARCHAR(3000),
  7 col2 VARCHAR(3000),
  8 col3 VARCHAR(3000),
  9 Lobdata NTEXT)
  
10 GO
  


  我们往表里插入数据
  

1 INSERT  INTO IAMTable  
2 VALUES  ( 1, 'A', 'B', 'C', N'Test' )
  

  这里我们插入的1条数据不会生成溢出行(row overflow)。我们使用DBCC IND命令列出分配给这个表的页。
  

1 DBCC IND('InternalStorageFormat','IAMTable',1)  

DSC0001.png

  从上图可以清楚看到,SQL Server为我们这个表分配了2个IAM页(page type为10),用来跟踪In-row data和LOB data的分配。因为当前的记录大小不足以创建ROW_OVERFLOW_DATA,SQL Server没有给我们分配一个IAM页来跟踪ROW_OVERFLOW_DATA的分配。
  我们来插入一条可以让SQL Serve生成ROW_OVERFLOW_DATA,并用DBCC IND命令查看页面分配情况。
  

1 INSERT  INTO IAMTable  
2 VALUES  ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' )
  
3
  
4 DBCC IND('InternalStorageFormat','IAMTable',1)
  

DSC0002.png

  现在表已经有了所有这3类分配单元。如果我们这表上有更多的分区,那就每个区都有独立的一系列IAM页。下图可以给你一个清晰的展示。
DSC0003.png

  简而言之,堆或B树结构至少有一个IAM页,最多有3倍分区个IAM页。如果表继续增长,页分配在不同的GAM区间,会有更多的IAM页增加。这些IAM页会链接起来,这个列表叫IAM链。
DSC0004.png

  现在我们已经知道了IAM页的用处,让我们一起看看在IAM页里是什么样的。我们知道,表或索引的第一个8页会分配在混合区的单个页面里。从刚才的图片我们知道175页是用来跟踪in-row data分配单元的IAM页,我们用DBCC PAGE命令看看页里面的信息是什么。
  

1 DBCC TRACEON(3604)  
2 go
  
3 DBCC PAGE('InternalStorageFormat',1,175,3)
  

DSC0005.png

  在 IAM:Header区域,我们看到下列字段:


  • sequenceNumber = 0          这是IAM页在IAM链中的位置。在IAM链中每增加1个IAM页,这里会加1。
  • status = 0x0                       未使用。
  • objectId = 0                        未使用。
  • indexId = 0                         未使用。
  • page_count = 0                   未使用。
  • start_pg = (1:0)                  这是页面映射的GAM区间。保存着在映射的GAM区间的第一个页ID。
  Single Page allocation 区域:这里显示的是从混合区分配的第1个8页。在第8页后,SQL开始从统一区分配。因此这个部分只用在第一个IAM页链。174和210页是从混合区分配的,这个和刚才DBCC IND('InternalStorageFormat','IAMTable',1)输出结果一致。
DSC0006.png

DSC0007.png

  Extent Alloc 区域:这里显示的是分配单元区分配。
  我们执行下列语句,往表里插入7条记录,这样的话,我们表里就有9条记录了,再用DBCC PAGE看下IAM页的信息。


  

1 INSERT  INTO IAMTable  
2 VALUES  ( 1, REPLICATE('A',3000), REPLICATE('A',3000), REPLICATE('A',3000), N'Test' )
  
3 go 7
  
4
  
5 DBCC TRACEON(3604)
  
6 go
  
7 DBCC PAGE('InternalStorageFormat',1,175,3)
  


DSC0008.png

  可以看到
  红色区域:自174,210之后,增加了212,214,215,217, 218,220,共8个页面,即混合区分配完成。
  蓝色区域:从224开始分配统一区了。
  使用DBCC IND查看下页面分配情况,完全一致:
  

1 DBCC IND('InternalStorageFormat','IAMTable',1)  

DSC0009.png


参考文章:
  http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/07/sql-server-understanding-the-iam-page/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423787-1-1.html 上篇帖子: 刷新SQL Server所有视图、函数、存储过程 下篇帖子: 爱技术,爱开源,爱linux! 在技术成长道路上,能拉一把就拉一把,不藏着不掖着! 我由衷希望能和有理想敢吃苦的it人一起共同进步,共同成长! 虽然我现在没有大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表