zoukankan      html  css  js  c++  java
  • 数据库.页

    页和区

    SQL Server 中数据存储的基本单位是页。
    区是由八个物理上连续的页构成的集合。 区有助于有效管理页。
    本指南介绍用于管理所有版本的 SQL Server 中的页和区的数据结构。
    要设计和开发高效执行的数据库,了解页和区的体系结构是很重要的。

    SQL Server 中数据存储的基本单位是页。
    为数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。
    磁盘 I/O 操作在页级执行。 也就是说,SQL Server 读取或写入所有数据页。
    区是八个物理上连续的页的集合,用来有效地管理页。

    页.基础介绍

    与常规书籍做类比:常规书籍中的所有内容都是写在书页上的。
    与书籍类似,SQL Server 所有数据行都写在页面上。
    书中的所有页都具有相同的物理大小。
    同样,SQL Server 所有数据页大小均相同 - 8 KB。
    书中的大多数页都包含数据(书的主要内容),某些页面包含有关内容的元数据(例如目录和索引)。
    SQL Server 也是如此:大多数页包含由用户存储的实际数据行;这些称为数据页面和文本/图像页面(在特殊情况下)。
    索引页包含有关数据位置的索引引用,最后有一些系统页,它们存储有关数据组织的各种元数据(PFS、GAM、SGAM、IAM、DCM、BCM 页)。
    请参阅下表了解页面类型及其说明。

    如前所述,在 SQL Server 中,页的大小为 8-KB。
    这意味着 SQL Server 数据库中每 MB 有 128 页。
    每页的开头是 96 字节的标头,用于存储有关页的系统信息。
    此信息包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元 ID。

    页.类型

    页类型 目录
    数据 当行中的文本设置为 ON 时,具有除 text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据以外的所有数据的数据行。
    索引 索引条目。
    Text/Image 大型对象数据类型:(text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 数据) 数据行超过 8 KB 时为可变长度数据类型列:(varchar、nvarchar、varbinary 和 sql_variant)
    Global Allocation Map、Shared Global Allocation Map 有关区是否分配的信息。
    页可用空间 (PFS) 有关页分配和页的可用空间的信息。
    索引分配映射 (Index Allocation Map) 有关每个分配单元中表或索引所使用的区的信息。
    大容量更改映射表 有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息。
    差异更改映射表 有关每个分配单元中自最后一条 BACKUP DATABASE 语句之后更改的区的信息。

    备注:日志文件不包含页,而是包含一系列日志记录。

    (???页类型是在什么时候确定的???)

    页.数据页

    6b14cbd1b42d7163148a853a46f021cc.gif

    在数据页上,数据行紧接着标头按顺序放置。
    页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。
    每个行偏移量条目记录对应行的第一个字节与页首的距离。
    因此,行偏移量的功能有助于 SQL Server 快速在页面上定位行。 行偏移表中的条目的顺序与页中行的顺序相反。

    行和列的概念,在这里出现的行和列,总感觉有点陌生.对行和列往底层的看,理解更深了一些.

    遇到了比较大的行怎么办?

    行不能跨页,但是行的部分可以移出行所在的页,因此行实际可能非常大。
    页的单个行中的最大数据量和开销是 8,060 字节 (8-KB)。 但是,这不包括用 Text/Image 页类型存储的数据。

    对于包含 varchar、nvarchar、varbinary 或 sql_variant 列的表,可以放宽此限制。
    当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,
    SQL Server 将从最大长度的列开始以动态方式将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。
    每当插入或更新操作将行的总大小增大到超过限制的 8,060 字节时,将会执行此操作。
    将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。
    如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页。

    CREATE TABLE dbo.bigrows_fixed  (   a char(3000),      b char(3000),     c char(2000),     d char(60) ) ;
    
    /*
    消息 1701,级别 16,状态 1,第 2 行
    创建或更改表 'bigrows_fixed' 失败,因为最小行大小是 8067,包括 7 字节的内部开销。而此值超出了允许的 8060 字节的最大表行大小。
    */
    

    07acebe4148e981ca44db855433db122.png

    CREATE TABLE dbo.bigrows  
      (a varchar(3000),  
       b varchar(3000), 
       c varchar(3000), 
       d varchar(3000) );
       
       --我们来确认一下SQL Server是如何存储行溢出数据的
       INSERT INTO dbo.bigrows
         SELECT REPLICATE('e', 2100), REPLICATE('f', 2100),
          REPLICATE('g', 2100),  REPLICATE('h', 2100);
    
     SELECT object_name(object_id) AS name,  
        partition_id, partition_number AS pnum,  rows,  
        allocation_unit_id AS au_id, type_desc as page_type_desc,
        total_pages AS pages
    FROM sys.partitions p  JOIN sys.allocation_units a
       ON p.partition_id = a.container_id
    WHERE object_id=object_id('dbo.bigrows');
    
    
    EXEC ('DBCC IND (test, bigrows, -1)')
    /*DBCC是SQL Server提供的一组控制台命令,功能很强大,掌握一些必要的语句,对操作数据库有不少帮助...*/
    

    ded4e9d198c6e1894fccaf78e54b8ddb.png

    总结

    页大小
    页类型
    行溢出,页的处理方式

    摘抄文档

  • 相关阅读:
    C语言I博客作业07
    C语言I 博客作业03
    我的第一次作业
    C语言I博客作业05
    js闭包在你身边却不知
    浅谈SQL Transaction在请求中断后的行锁表锁
    事件订阅分发模型
    js 继承 对象方法与原型方法
    PHP学习笔记有关php中的变量
    PHP学习笔记不同编码占据不同的字节
  • 原文地址:https://www.cnblogs.com/love-zf/p/13556513.html
Copyright © 2011-2022 走看看