zoukankan      html  css  js  c++  java
  • [译]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来找到一个可用的统一扇区.

     

      

  • 相关阅读:
    树分治
    实现自己的shell--MIT xv6 shell
    逆元打表
    Linux fork()函数
    三分:求解凸函数极值
    anti-nim 游戏
    nginx配置文件详解
    nginx之别名、location使用
    shell脚本编程基础知识点
    linux任务计划
  • 原文地址:https://www.cnblogs.com/alphaqcode/p/4988441.html
Copyright © 2011-2022 走看看