zoukankan      html  css  js  c++  java
  • 数据库.存储.区

    区.介绍

    区是管理空间的基本单位。
    一个区是八个物理上连续的页(即 64 KB)。
    这意味着 SQL Server 数据库中每兆字节有 16 个区。

    区.类型

    SQL Server 有两种盘区类型:
    统一盘区,由单个对象所有。盘区中的所有八页只能由所属对象使用。
    混合盘区,最多可由八个对象共享。 区中八页的每页可由不同的对象所有。
    一直到(并且包括)SQL Server 2014 (12.x),SQL Server 不会将所有盘区分配给包含少量数据的表。
    新表或索引通常从混合区分配页。
    当表或索引增长到 8 页时,将变成使用统一区进行后续分配。
    如果对现有表创建索引,并且该表包含的行足以在索引中生成 8 页,则对该索引的所有分配都使用统一区进行。
    但是,从 SQL Server 2016 (13.x) 开始,数据库中所有分配的默认值都是统一区。

    f0d968228ce36e1ed951c50fd1dd4eec.gif

    有没有一点像垃圾回收?

    区.管理分配

    SQL Server 使用两种类型的分配映射表来记录盘区的分配:

    • 全局分配映射表 (GAM)
      GAM 页记录已分配的区。 每个 GAM 包含 64,000 个区,相当于近 4 GB 的数据。 GAM 用 1 个位来表示所涵盖区间内的每个区的状态。 如果位为 1,则区可用;如果位为 0,则区已分配。
    • 共享全局分配映射表 (SGAM)
      SGAM 页记录当前用作混合区且至少有一个未使用的页的区。 每个 SGAM 包含 64,000 个区,相当于近 4-GB 的数据。 SGAM 用 1 个位来表示所涵盖区间内的每个区的状态。 如果位为 1,则区正用作混合区且有可用页。 如果位为 0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。

    根据区当前的使用情况,GAM 和 SGAM 中每个区具有以下位模式。

    区的当前使用情况 GAM位设置 SGAM位设置
    可用,未使用 1 0
    统一区或已满的混合区 0 0
    具有可用页的混合区 0 1

    这将简化区管理算法。

    • 若要分配统一区,SQL Server 数据库引擎将搜索 GAM 以查找为 1 的位并将其设置为 0。
    • 为了查找具有可用页的混合区,SQL Server 数据库引擎搜索 SGAM 以查找为 1 的位。
    • 若要分配混合区,SQL Server 数据库引擎在 GAM 中搜索为 1 的位,并将其设置为 0;然后将 SGAM 中的对应位设置为 1。
    • 若取消分配某个区,SQL Server 数据库引擎确保 GAM 位设置为 1,而 SGAM 位设置为 0。 
      SQL Server 数据库引擎 在内部实际使用的算法比本文介绍的内容更复杂,因为 SQL Server 数据库引擎 在数据库中平均分布数据。 
      但是,由于无需管理区分配信息链,因此即使是实际算法也会被简化。

    实战(Copy他人)看表如何分配区

    USE Test
    GO
    
    IF EXISTS ( SELECT  *
                FROM    sysobjects
                WHERE   id = OBJECT_ID(N'[dbo].[TestSpaceAllocation]')
                        AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
        DROP TABLE dbo.TestSpaceAllocation
    
    CREATE TABLE TestSpaceAllocation(
       Name CHAR(8000)
    )
    GO
    
    INSERT INTO TestSpaceAllocation VALUES('Woody')
    GO 26
    
    DBCC IND('Test','TestSpaceAllocation',1)
    
    

    356164b0b695ed4f283f1bbaa7537685.png

    从上图我们可以清楚的看到,绿色区域的第一个8页不属于同个区(混合区),因为页面号不连续,207与94752之间有缺口。
    接下来蓝色和红色区域是属于同个区(统一区),因为它们的页面号是连续的。
    当我们以碎片级别来看待这个情况时,可以发现表越小,碎片越高。即使你用索引重建,这个高碎片也不会减少。
    这个背后的原因就是SQL Server分配新的表或索引对象时,总是首先从混合区分配空间。
    SQL Server为新表或索引从混合区开始分配页。
    一旦表增长超过8页。SQL Server需要从统一区分配页。
    当表或索引为新的或修改的数据需要更多的容纳空间时,SQL Server需要这些表或索引分配页。
    如果表或索引的大小小于8页。SQL Sever需要从混合区给它们分配空间。
    如果大小超过8页,SQL Server需要从统一区分配页。SQL使用2类不同的页来更好管理这个分配操作。

    了解页和区的作用?

    不要为了分享而分享,大家觉得学这个区的知识有什么用处?

    比如,刚才创建表,报错了,你一看就能大概有个思路...
    优化表设计,以及以后表太大了,优化有帮助?

    总结

    待整理问题

    • 跟踪可用空间
    • 管理对象使用的空间
    • 跟踪已修改的区

    摘抄文档

  • 相关阅读:
    Hihocoder-小Hi的烦恼
    Python包下载与离线安装
    Shell输出颜色设置
    MySQL主从配置
    MySQL初始化与用户配置
    [转]常用 GDB 命令中文速览
    搭建github静态博客
    树莓派上手
    vim安装与配置
    数组,看了你就懂了!
  • 原文地址:https://www.cnblogs.com/love-zf/p/13556519.html
Copyright © 2011-2022 走看看