美高梅官方网站3045-mgm6608美高梅app下载
美高梅官方网站3045SQL Server 存储(1/8):理解数据页结构

美高梅官方网站3045SQL Server 存储(1/8):理解数据页结构

作者:美高梅官方网站3045    来源:未知    发布时间:2019-12-29 21:39    浏览量:

数据页是包含已添加到数据库表中的用户数据的结构。

我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行。也就是说,SQL Server 读取或写入所有数据页。页有不同的类型,像数据页,GAM,SGAM等。在这文章里,让我们一起来理解下数据页结构。

《Microsoft Sql server 2008 Internals》索引目录:

如前所述, 数据页有三种, 每个都以不同的格式存储数据。

SQL Server把数据记录存在数据页(Data Page)里。数据记录是堆表里、聚集索引里叶子节点的行。

《Microsoft Sql server 2008 Internal》读书笔记--目录索引

SQL server 有行内数据页、行溢出数据页和 LOB 数据页。

数据页由3个部分组成。页头(标头),数据区(数据行和可用空间)及行偏移数组。

 

与 SQL server 中的所有其他类型的页一样, 数据页的大小固定为 8 KB 或8192字节。

美高梅官方网站3045 1

 

它们由三主要组件组成: 页面页眉、数据行和行偏移量数组, 如图6-4 所示。

在我们讨论在SQL Server里,数据页内部结构具体是什么样之前,我们来创建一个表并插入一些记录。

上篇我们主要学习了元数据(metadata)的存储及利用目录视图来查询这些信息,今天,我们继续学习数据页(Data Pages)。

美高梅官方网站3045 2

 

 数据页(Data pages)是包含已经添加到数据库的表中的用户数据的结构。正如前面所看到的,数据页有三类,每类数据页以不同的方式存储数据。复习一下,分别是in-row data pages、row-overflow data pages和LOB data pages。与其它类型的page一样,data pages也是固定的8K大小或8192 bytes。它由三类组件组成:the page Header,data rows和the row offset array,如下图所示:

 

 1 USE [InternalStorageFormat]
 2 GO
 3 
 4 IF EXISTS ( SELECT  *
 5             FROM    sysobjects
 6             WHERE   id = OBJECT_ID(N'[dbo].[Customers]')
 7                     AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
 8     DROP TABLE dbo.Customers
 9 
10 CREATE TABLE Customers
11 (
12    FirstName CHAR(50) NOT NULL,
13    LastName CHAR(50) NOT NULL,
14    Address CHAR(100) NOT NULL,
15    ZipCode CHAR(5) NOT NULL,
16    Rating INT NOT NULL,
17    ModifiedDate DATETIME NOT NULL,
18 )
19 GO
20 
21 
22 INSERT INTO dbo.Customers
23         ( FirstName ,
24           LastName ,
25           Address ,
26           ZipCode ,
27           Rating ,
28           ModifiedDate
29         )

30 VALUES  ( 'Woody' , -- FirstName - char(50)
31           'Tu' , -- LastName - char(50)
32           'ZUOQIAO YOUXI TOWN LINHAI CITY' , -- Address - char(50)
33           '0000' , -- ZipCode - char(5)
34           1 , -- Rating - int
35           '2015-05-07 10:09:51'  -- ModifiedDate - datetime
36         )
37         go 2

美高梅官方网站3045 3

页标题

现在我们要找出SQL Server给这个表分配的页有哪些,这个就要用到非文档的命令DBCC IND。
它的语法如下:

1、Page Header

 

DBCC IND 命令用于查询一个存储对象的内部存储结构信息,该命令有4个参数, 前3个参数必须指定。语法如下:
DBCC IND ( { 'dbname' | dbid }, { 'objname' | objid },{ nonclustered indid | 1 | 0 | -1 | -2 } [, partition_number] )
第一个参数是数据库名或数据库ID。
第二个参数是数据库中的对象名或对象ID,对象可以是表或者索引视图。
第三个参数是一个非聚集索引ID或者 1, 0, 1, or 2. 值的含义:
 0: 只显示对象的in-row data页和 in-row IAM 页。
 1: 显示对象的全部页, 包含IAM 页, in-row数据页, LOB 数据页row-overflow 数据页 . 如果请求的对象含有聚集所以则索引页也包括。
 -1: 显示全部IAM页,数据页, 索引页 也包括 LOB 和row-overflow 数据页。
 -2: 显示全部IAM页。
 Nonclustered index ID:显示索引的全部 IAM页, data页和索引页,包含LOB和 row-overflow数据页。
为了兼容sql server 2000,第四个参数是可选的,该参数用于指定一个分区号.如果不给定值或者给定0, 则显示全部分区数据。
和DBCC PAGE不同的是, SQL Server运行DBCC IND不需要开启3604跟踪标志.

正如上图所示,每个data page (除去96 bytes,还有8096 bytes存放data,row overhead和row offset)。你可以使用下面的DBCC Page命令来查看。

如图6-4 所示, 页标题占据每个数据页的前96个字节 (为数据、行开销和行偏移保留8096个字节)。表6-5 列出了检查页标题时显示的一些信息。

我们来执行下列的命令:

2、Data Rows for in-Rows

美高梅官方网站3045 4

1 DBCC IND('InternalStorageFormat','Customers',-1)

 Page Header的下面是row data,单个数据行最大可以存放8060 bytes的in-row data,这就是以前数据行不能超过8060限制的原因!有些行也可以在独立的页面(pages)中存放row-overflow data和LOB数据,存储在一个给定的page变量中的行数取决于表结构及数据被存放的结构。一个拥有全部固定长度列的表每页能存储相同的行数。一个拥有可变长度列的表在页中存放不同的行数以适应数据的实际长度。保持行长度尽量短,允许更多的行以适应页面,减少了I/O,改善了高速缓存命中率(cache-hit ratio)。

 

SQL Server会给我们如下的输出结果:
美高梅官方网站3045 5

因此,作为系统架构师或数据库Designer,实在有必要了解这些啊。邀月深有体会。呵呵。程序很烂,是后天的,但数据结构不合理,那是先天的,两者的杀伤力同样惊人!

行内数据的数据行

可以看到有2条记录,一条记录为页面类型(PageType)为10的页和一条记录为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页面类型(PageType)1是数据页,它的页ID是79.

3、Row Offset Array

 

关于数据库页类型如下所示:

行偏移数组(row offset array) 是一个2-byte entries的块(block),每个项说明对应数据行在页开始的偏移,每行(row)有一个两字节的项。尽管这些字节不会和数据一起存储在行中,它们能影响适应page的行数。行偏移数组揭示了行在页上的逻辑顺序。比如,如果一个表有一个聚集索引,SQL Server按聚集索引键的顺序存放数据。这并不意味着数据是物理按聚集索引键的顺序存放,而是行偏移数组的Slot 0 指向聚集索引键序列的第一行(row),Slot 1 指向第二行,等等。当我们要快速查看实际页的时候,这些行的物理位置可能在页的任何位置。

页标题后面是存储表实际数据行的区域。单个数据行的最大大小为8060字节的行内数据。

  • 1 Data page 堆表和聚集索引的叶子节点数据
  • 2 Index page 聚集索引的非叶子节点和非聚集索引的所有索引记录

  • 3 Text mixed page A text page that holds small chunks of LOB values plus internal parts of text tree. These can be shared between LOB values in the same partition of an index or heap.

  • 4 Text tree page A text page that holds large chunks of LOB values from a single column value.

  • 7 Sort page 排序时所用到的临时页,排序中间操作存储数据用的。

  • 8 GAM page 全局分配映射(Global Allocation Map,GAM)页面 这些页面记录了哪些区已经被分配并用作何种用途。

  • 9 SGAM page 共享全局分配映射(Shared Global Allocation Map,GAM)页面 这些页面记录了哪些区当前被用作混合类型的区,并且这些区需含有至少一个未使用的页面。

  • 10 IAM page  有关每个分配单元中表或索引所使用的区的信息

  • 11 PFS page  有关页分配和页的可用空间的信息

  • 13 boot page 记录了关于数据库的信息,仅存于每个数据库的第9页

  • 15 file header page 记录了关于数据库文件的信息,存于每个数据库文件的第0页

  • 16 DCM page 记录自从上次全备以来的数据改变的页面,以备差异备份

  • 17 BCM page 有关每个分配单元中自最后一条 BACKUP LOG 语句之后的大容量操作所修改的区的信息

 检查数据页(Exampling Data Pages)

行还可以在单独的页上存储行溢出和 LOB 数据。

现在我们来看看79号类型为1的数据页里存放的数据,这个就要用到DBCC PAGE命令,它的语法如下:

 DBCC page命令可以帮我们查询:MSDN文档中中没有提供此命令,微软真的很那个啊。语法为:

在给定页上存储的行数根据表结构和存储的数据而变化。

dbcc page 命令读取数据页结构的命令DBCC Page。
该命令为非文档化的命令,具体如下:
  DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
  具体参数描述如下:
  dbid 包含页面的数据库ID
  dbname 包含页面的数据库的名称
  filenum 包含页面的文件编号
  pagenum 文件内的页面
  printopt 可选的输出选项;选用其中一个值:
  0:默认值,输出缓冲区的标题和页面标题
  1:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表
  2:输出缓冲区的标题、页面标题(整体输出页面),以及行偏移量表
  3:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表;每一行
  后跟分别列出的它的列值
  要想看到这些输出的结果,还需要设置DBCC TRACEON(3604)。

DBCC PAGE ({dbid | dbname},filenum,pagenum[,printopt])

具有所有固定长度列的表始终可以存储每页相同的行数;

我们来执行下列的命令:

其中,最后一个参数可以是0,1,2,3,默认为0,有兴趣的朋友可以比较下这个参数的区别。我们作个示例:

可变长度行可以根据输入数据的实际长度, 存储尽可能多的行。

1 DBCC TRACEON(3604)
2 DBCC PAGE(InternalStorageFormat,1,79,3)
3 GO    

DBCC traceON(3604)
go
--查询testdb数据库的第一个文件的第157页的数据页
DBCC PAGE (testdb,1,157,1);
GO

保持行长更短可以使更多行适合页面, 从而减少 i/o 并增加所需数据在缓存中的可能。

SQL Server会给我们包含4个部分的输出。第1部分是BUFFER,里面是一些内存分配信息,对此我们没多少兴趣。下一部分是固定96 bytes大小的页头(page header),页头(page header)会类似如下显示:

查询结果如下:

 

美高梅官方网站3045 6

美高梅官方网站3045 7

行偏移量数组

页头相关字段的含义:

美高梅官方网站3045 8

下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.zen-40.com. mgm美高梅有限公司 版权所有