[译]SQL Passion Week 3: SQL Server的扇区管理

SQL Passion Week 3: SQL Server的扇区管理

 

混合扇区和统一扇区

 

  SQL Server中每8个数据页作为一个扇区. 在混合扇区中, 其包含的8个页可以分别属于不同的数据库对象; 另一方面, 统一扇区里的8个页都属于同一个数据库对象.

  为什么有这样一个区别呢, 这其实主要是因为一个历史遗留问题.  因为在上个世纪, 存储是非常昂贵的, 人们会尽可能有效的充分利用存储空间.

  当一个表和索引最初创建时, 总是创建在一个混合扇区上, 先在8kb的空间里进行增长. 这样, 小的表就只需要占据很小的存储空间.  当你的表增长到第9个页的时候, SQL Server才会分配给你一个统一扇区. 把混合扇区的页移到统一扇区, 后续的页继续分配到混合扇区, 然后累积到第17页时, 再分配一个统一扇区, 把混合扇区里的页移到第二个同意扇区, 以此类推. 放到今天, 我们肯定要对这个做法摇头, 但在那个存储昂贵的时期, 这个设计是非常非常重要的.

  

  

  扇区管理

  那现在的SQL Server如何管理这些扇区呢, 假设你现在有一个1TB的数据库, 这将包含数量巨多的扇区. SQL Server用了两个特殊的页(当然同样是8kb):

  • Global Allocation Map Pages (GAM)
  • Shared Global Allocation Map Pages (SGAM)

 

  GAM来管理统一扇区, 在GAM页上, 有8000bytes,等同于64000bits.(8000 * 8) 每一个bit都代表了一个统一扇区. 如果一个bit是有值的,就表示这个统一扇区可用, 相反, 则表示这个统一扇区已被占用.

  也就是说,一个GAM页能管理4GB的数据( 64000 * 64kb / 1024 / 1024 ).

  SGAM也是同样的道理.

  当我们向表中插入一条数据时, SQL Server就会通过SGAM寻找一个至少有一个空页可用的混合扇区来放入. 而当表/索引超过64kb时,就会通过GAM来找到一个可用的统一扇区.

 

  

posted @ 2015-11-23 14:45  AlphaQcode  Views(235)  Comments(0Edit  收藏  举报