《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)
《Microsoft Sql server 2008 Internals》读书笔记订阅地址:
http://www.cnblogs.com/downmoon/category/230397.html/rss
《Microsoft Sql server 2008 Internals》索引目录:
《Microsoft Sql server 2008 Internal》读书笔记--目录索引
在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是:
关于FileGroup
如果你的系统是用Raid设备直接存放data文件,则不需要再借助FileGroup,因为FileGroup会增加数据库会影响复杂性和灵活性。
如果你的磁盘空间许可,你仍然不需要使用FileGroup,只要在同一个驱动器内增加一连串的File就可以了。
如果计划在不同的驱动器使用表和索引分区Partition内容,应该使用FileGroup
关于MultiFile ,可以有两个好处:
第一,你不总是有120G的空间来存放一个文件,而3个40G的空间要好找的多。
第二、只移动一个40G的文件到另一个分区比移动一个120G的文件,要容易,也不易出错。
关于FileStream FileGroup与FileGroup的不同,
如果在创建数据时使用了FileStream参数,如下:
-- filestream columns:
CREATE DATABASE MYMOVIEREVIEWS
ON
PRIMARY
( NAME = REVIEWS_DATA,
FILENAME = 'C:\DATA\REVIEWS_DATA.MDF'),
FILEGROUP MOVIEREVIEWSFSGROUP1 CONTAINS FILESTREAM
( NAME = REVIEWS_FS,
FILENAME = 'C:\DATA\REVIEWS_FS')
LOG ON ( NAME = REVIEWS_LOG,
FILENAME = 'C:\DATA\REVIEWS_LOG.LDF');
GO
则在C:\DATA\REVIEWS_FS下会生成一个$FSLOG文件夹和一个FileStream.hdr文件,这个hdr文件就是一个FileStream 包含关文件,不能被修改和移动。在运行Alter database时,会覆盖为最新的一个。
关于FileStream编程模型实现,请参照:
使用 FileStream SQL Server 2008 中编程http://msdn.microsoft.com/zh-cn/magazine/dd695918.aspx
引擎盖下的数据库(Databases under the hood)
一个数据库由可以持久存储用户对象如用户表和索引等的空间组成,这些空间由用户创建数据库时指定。而这些空间被指派到一个或多个操作系统文件。
数 据库被分成了一个个的逻辑页(logical pages),每个逻辑面为8KB大小,在数据文件中,这些逻辑页由数字0-X连续存放,X由文件的大小确定,你可以通过·定义一个数据库 ID(databse ID),一个文件ID或页面数,比如3等,来指向任何一个页。当你使用Alter database来增加数据库大小时,新的空间被加到数据文件的末尾,那就意味着:新分配空间的第一页是X+1。当你使用DBCC ShrinkDatabase或DBCC ShrinkFile命令时,位于最高数字的页面先被移去,这些页位于数据文件的末尾,然后依次是低数字的页面,这保证页面的数字始终是连续的。是不是感觉有点像堆栈的操作?呵呵。
当你创建一个数据库时Create Database时,会产生一个惟一的ID,Database ID,你可以在sys.databses视图找到它。该视图返回所有数据库的名称、database_id等参数。
空间分配
存 放数据库表和索引的空间,被托管在一个个很小的单元,我们称为“范围”(extent),每一个范围由8个连续的页面组成,共64K。为了使空间分配更加 高效,SQL Server 2008并没有完全分配范围到所有小数据量的表,SQL Server 2008有两种类型的范围(Extent)
1、标准范围(Uniform extent):
范围被一个单独的对象所拥有,范围内所有8个页面只被各自的一个对象拥有。
2、混合范围(Mixed extent):
范围被8个页面所共享。
SQL Server对于新表或索引分配空间时默认为混合范围,当表或索引增加到8个页面时,所有内容改为标准范围。
当 一个表或索引需要更多的空间时,SQL Server将会查找已经被分配的可用空间,当表或索引的页面数还没有达到8个时,SQL Server一定找到一个可用的混合范围。如果表或索引都等于8个页面或更多时,SQL Server 必须找到一个新的自由的标准范围。
SQL Server使用两种类型的页面来记录范围的分配和可用类型:
Global Allocation Map(GAM) pages(page 2)和Shared Global Allocation Map(SGAM)pages(page 3)
.关于GAM/SGAM更多的资料,或者想要详细了解一个数据库的空间分配情况,请参看:
http://msdn.microsoft.com/zh-cn/library/ms175195.aspx
此外,如果范围的总大小超过4GB,超过的部分将由IAM pages(page 4)来分配。
Page Free Space(PFS) page (page 5)
Differential Changed Map(DCM) page (page 6)
Bluk Changed Map(BCM) page (page 7)
数据库快照(Database Snapshot)
数据库快照是SQl2005企业版开始提供的一项新功能,它允许你创建一个任何数据库的一个只读的实时点。事实上,你可以创建多个快照点。快照的一大好处是使用空间比原始数据库少的多。困为它只在存储了已经发生变化的页面(pages),
关于SnapShot的更多内容,请参看
http://msdn.microsoft.com/zh-cn/library/ms175158%28SQL.90%29.aspx
需要注意的是:
1、model,master,tempdb这三个系统数据库不能创建快照。
2、快照继承源数据库的安全限制,因为它是只读的,你不能修改快照的权限许可。
3、如果你删除了源数据库的一个用户,这个用户仍然在快照中。
4、快照不能被备份和恢复,但是源数据库的备份与恢复不受快照影响。
5、快照不能被附加(attach)或分离(detach)
6、快照不支持全文检索,也不能传播源数据库的全文分类(full-text catagies)。
下面将继续关注Tempdb数据库