今日和一个朋友聊起数据库,伊很愤愤的说,数据库不就是一堆文件读取写入吗,我找几个人干一年也差不过弄个能用的出来,干吗那么贵。实话说,此话有他的道理,虽然各大数据库厂商不遗余力的在自己的产品上叠加无穷无尽的概念,增加无数的噱头,归根到底,它所做的就是读写文件这么简单。但是从另一个方面来讲,数据库的价值在于能够永远正确的读写文件,不管是在多用户并发的时候,在出现系统崩溃的时候在,在数据容量超乎想象的巨大的时候,它永远能够在可控制的方式下把某个bit,0或者1,持久保存。
研究数据库如何实现这一点是有趣的。
为方便讨论,本文以SQL Server2005为例。 假设我们创建一个简单的数据,没有添加额外的数据文件,也没有对数据库的表建分区。那么该数据库的所有表会存到一个文件里面,我们称之为数据文件,当然日志写到另外一个。数据文件从物理上讲就是一个普通的操作系统文件,但是从逻辑上分成很多个页,每个页是连续的8K字节,同时连续的8个页是数据库增长的分配单位,称为Extent。从更高一层的逻辑上讲,属于同一个Table或Index等数据库对象的Extent,是一个Allocation Unit。之所以要提到它是因为在插入新的行时,我们需要在Allocation unit上操作。
相信你已经注意到3个关键词 Page,Extent, Allcation Unit。
Page是数据库大厦的基本构成模块,有以下几类:
- 数据类: 常规数据,溢出数据,大对象数据
- 空闲索引类:空闲页面索引,全局Extent索引,全局混用extent索引,分配单元Extent索引
- 修改跟踪类:自从上次backup database发生修改的,backup log发生修改的
这么多类别的页面是如何组织在一起的呢。让我们变身成能看到硬盘数据的小精灵,来参观数据库这个城堡,在这里数据文件是这里的一个街区。我们看到一条遥遥无尽的马路边上,整齐的排着小平房,每个房间写着Page01,Page02...,每个8个房间之间有一条小道隔开。
第一个房子是紫色的,象征着至高无上的权利,对,它是独一无二的,它保存的是整个文件的相关信息。
第二个房子是混合颜色,嗯,它还会变颜色,哦,它是空闲页面索引页,它里面住着8K字节,每个字节描述它管辖范围内8K房间的饱和状态,如果都满了,它就变成黑色。这个房子不是唯一的,每个8K个页面里就有他的一个同类。
第三个和第四个房子长的很像,一个是深蓝色,一个浅蓝色,哦,他们是Extent索引页,他们里面的每个bit,64000个哦,每个bit描述它管辖范围内的一个Extent,3号房管的是专用Extent的,4号管混用Extent的;他们也不是唯一的,没64000个Extent里,有它们兄弟的克隆。
第5、6个房子是灰色和黑色,代表主人比较低调。他们是表示其后的64K extent是否发生修改的。他们出现频率和他们的邻居一样。
再后面的个房间是绿色的,他们是真正存放数据的地方,房间里像抽屉一样一格一个的。
细看之下发现其中有一些浅紫色的房子。这是分配单元索引的家。它的第一层住着一些byte,告诉我们它管辖哪些Extent,这些Extent都是一个表服务的。它还告诉我们它的一个兄弟在哪里,它也管着最多64K的extent。它的其他楼层里住着8K的bit,分别描述它管辖范围内的Extent的使用情况。
这个时候城市里突然响起来了广播: X表搬来了新的住户,请负责安置。
正在一愣之间,看见一道身影掠过,径直跑到一个浅绿的房前:喂,是你们表吧,找个空闲页面安置一下。
好,我看看,哎呀,我这里已经注满了,给我我兄弟的住址,你去问问它吧?
可是它兄弟也注满了。
身影跑到蓝色的房子那里,嘿,X表需要空间,您帮着找个空闲的Extent吧;
两兄弟异口同声的说,好,嗯,35499号Extent还有空闲的页面给X表吧;
就这样一个新的房间被占用了。细看35499号extent,它住着好几个表的Page,原来这是个临时居住地,各个表混住的。
突然,X表的IAM站起来说,我们表在临时居住区的Page已经达到8个了,请分配给我们一个专用Extent,我们不希望和别的表发生冲突。
蓝色兄弟说,好,36700好extent专门给你们了,你的Page赶快搬走吧。
嗯,我要吃饭去了,再见。。。