菜鸟学SQLServer--页和区

 

为了加深自己理解,理清自己对哪些知识点还是模糊不清,哪些已经掌握,故此开通博客园博客。希望借此平台提供的交流机会学习到更多,修正自己的错误。

为什么要选SQLserver,这个博客园多数都是.NET战士,而现在一个程序往往脱离不了数据库。

闲话不多说,先来第一篇:页和区

先看看MSDN的定义:

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

区是八个物理上连续的页的集合,用来有效地管理页。所有页都存储在区中。

 

看到这个不禁让我想起硬盘的逻辑结构, 扇区和簇。

页:

页的大小是8KB,区是8个物理上连续的页也就是8*8KB=64KB

页中的头96字节存储的是系统信息,剩余的才是存储我们的数据

 

-----------------------------------------------------------------------------

那么实际看上去页到底是怎样的呢?

打开3604的trace,用DBCC page命令就能输出:

dbcc traceon(3604)
dbcc page(AdventureWorks2014,1,783,3)
--dbcc page ( {‘dbname‘ | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])

***************************************************

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

PAGE: (1:783)


BUFFER:


BUF @0x000000013C03F480

bpage = 0x000000012DD48000 bhash = 0x0000000000000000 bpageno = (1:783)
bdbid = 7 breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 24783 bstat = 0x9
blog = 0x15ab215a bnext = 0x0000000000000000

PAGE HEADER:

这里就是我们说的标头,大小为96字节
Page @0x000000012DD48000

m_pageId = (1:783) m_headerVersion = 1 m_type = 10 从m_type中可以看出这个是IAM页
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x200
m_objId (AllocUnitId.idObj) = 240 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594053656576
Metadata: PartitionId = 72057594047102976 Metadata: IndexId = 1
Metadata: ObjectId = 1765581328 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 90 m_slotCnt = 2 m_freeCnt = 6
m_freeData = 8182 m_reservedCnt = 0 m_lsn = (42:6456:383)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 653052196 DB Frag ID = 1

Allocation Status

GAM (1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED
PFS (1:1) = 0x70 IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL DIFF (1:6) = NOT CHANGED
ML (1:7) = NOT MIN_LOGGED

IAM: Header @0x000000000D21A064 Slot 0, Offset 96 Slot 0槽位的偏移量为96字节,印证了前面说的页标头用96字节记录信息

sequenceNumber = 0 status = 0x0 objectId = 0
indexId = 0 page_count = 0 start_pg = (1:0)


IAM: Single Page Allocations @0x000000000D21A08E

Slot 0 = (1:903) Slot 1 = (1:914) Slot 2 = (1:915)
Slot 3 = (1:916) Slot 4 = (1:917) Slot 5 = (1:918)
Slot 6 = (1:919) Slot 7 = (1:920)


IAM: Extent Alloc Status Slot 1 @0x000000000D21A0C2

(1:0) - (1:1240) = NOT ALLOCATED 为什么1240接下来就是1248? 因为一个区是8个页, 
(1:1248) - (1:2992) = ALLOCATED
(1:3000) - (1:3032) = NOT ALLOCATED
(1:3040) - (1:4160) = ALLOCATED
(1:4168) - (1:4216) = NOT ALLOCATED
(1:4224) - (1:4712) = ALLOCATED
(1:4720) - = NOT ALLOCATED
(1:4728) - (1:4888) = ALLOCATED
(1:4896) - = NOT ALLOCATED
(1:4904) - (1:4912) = ALLOCATED
(1:4920) - (1:4928) = NOT ALLOCATED
(1:4936) - (1:4976) = ALLOCATED
(1:4984) - (1:4992) = NOT ALLOCATED
(1:5000) - (1:5064) = ALLOCATED
(1:5072) - (1:8880) = NOT ALLOCATED
(1:8888) - (1:9048) = ALLOCATED
(1:9056) - (1:26264) = NOT ALLOCATED


DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

***************************************************

区:

了解了页之后,区也就很容易理解了。 8个页组成一个区,大小是8*8KB=64KB。

区分为两种:混合区和统一区

再来查看一下两者在MSDN的定义:

  • 统一区,由单个对象所有。区中的所有 8 页只能由所属对象使用。

  • 混合区,最多可由八个对象共享。区中八页的每页可由不同的对象所有。

我们很容易理解,如果我们的数据库存在很多很少的对象,比如含有很少数据行的的索引或表

那么我们分配一页给它们就足够容纳了,这样就可以放在混合区里面。 如果我们分配一个区64KB给这些小对象,那么磁盘空间将很浪费

假如有一个很大的数据表,它占用超过一个区的容量,那么我们就可以用统一区来管理这个对象的页面

以上是我查看MSDN后的理解,如果错误多多包涵,请给予指正

 

参考:

https://msdn.microsoft.com/zh-cn/library/ms190969(v=sql.105).aspx

http://www.cnblogs.com/Amaranthus/archive/2011/05/03/2035497.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。