数据库.存储.区

区.介绍

区是管理空间的基本单位。
一个区是八个物理上连续的页(即 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类不同的页来更好管理这个分配操作。

了解页和区的作用?

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

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

总结

待整理问题

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

摘抄文档

posted @ 2020-08-24 21:41  zh89233  阅读(240)  评论(0编辑  收藏  举报