完整word版SQLServer的物理数据库结构详解Word文档格式.docx
- 文档编号:18378165
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:34
- 大小:215.83KB
完整word版SQLServer的物理数据库结构详解Word文档格式.docx
《完整word版SQLServer的物理数据库结构详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《完整word版SQLServer的物理数据库结构详解Word文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
DifferentialChangedMap
有关每个分配单元中自最后一条BACKUPDATABASE语句之后更改的区的信息。
注意:
日志文件不包含页,而是包含一系列日志记录。
在数据页上,数据行紧接着标头按顺序放置。
页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。
每个条目记录对应行的第一个字节与页首的距离。
行偏移表中的条目的顺序与页中行的顺序相反。
大型行支持
在SQLServer2005中,行不能跨页,但是行的部分可以移出行所在的页,因此行实际可能非常大。
页的单个行中的最大数据量和开销是8,060字节(8KB)。
但是,这不包括用Text/Image页类型存储的数据。
在SQLServer2005中,包含varchar、nvarchar、varbinary或sql_variant列的表不受此限制的约束。
当表中的所有固定列和可变列的行的总大小超过限制的8,060字节时,SQLServer将从最大长度的列开始动态将一个或多个可变长度列移动到ROW_OVERFLOW_DATA分配单元中的页。
每当插入或更新操作将行的总大小增大到超过限制的8,060字节时,将会执行此操作。
将列移动到ROW_OVERFLOW_DATA分配单元中的页后,将在IN_ROW_DATA分配单元中的原始页上维护24字节的指针。
如果后续操作减小了行的大小,SQLServer会动态将列移回到原始数据页。
有关详细信息,请参阅行溢出数据超过8KB。
区
区是管理空间的基本单位。
一个区是八个物理上连续的页(即64KB)。
这意味着SQLServer数据库中每MB有16个区。
为了使空间分配更有效,SQLServer不会将所有区分配给包含少量数据的表。
SQLServer有两种类型的区:
∙统一区,由单个对象所有。
区中的所有8页只能由所属对象使用。
∙混合区,最多可由八个对象共享。
区中八页的每页可由不同的对象所有。
通常从混合区向新表或索引分配页。
当表或索引增长到8页时,将变成使用统一区进行后续分配。
如果对现有表创建索引,并且该表包含的行足以在索引中生成8页,则对该索引的所有分配都使用统一区进行。
SQLServer2005将数据库映射为一组操作系统文件。
数据和日志信息从不混合在相同的文件中,而且各文件仅在一个数据库中使用。
文件组是命名的文件集合,用于帮助数据布局和管理任务,例如备份和还原操作。
数据库文件
SQLServer2005数据库具有三种类型的文件:
∙主数据文件
主数据文件是数据库的起点,指向数据库中的其他文件。
每个数据库都有一个主数据文件。
主数据文件的推荐文件扩展名是.mdf。
∙次要数据文件
除主数据文件以外的所有其他数据文件都是次要数据文件。
某些数据库可能不含有任何次要数据文件,而有些数据库则含有多个次要数据文件。
次要数据文件的推荐文件扩展名是.ndf。
∙日志文件
日志文件包含着用于恢复数据库的所有日志信息。
每个数据库必须至少有一个日志文件,当然也可以有多个。
日志文件的推荐文件扩展名是.ldf。
SQLServer2005不强制使用.mdf、.ndf和.ldf文件扩展名,但使用它们有助于标识文件的各种类型和用途。
在SQLServer2005中,数据库中所有文件的位置都记录在数据库的主文件和master数据库中。
大多数情况下,数据库引擎
使用master数据库中的文件位置信息。
但是,在以下情况中,数据库引擎使用主文件中的文件位置信息来初始化master数据库中的文件位置项:
∙使用带有FORATTACH或FORATTACH_REBUILD_LOG选项的CREATEDATABASE语句来附加数据库时。
∙从SQLServer2000版或7.0版升级到SQLServer2005时。
∙还原master数据库时。
逻辑和物理文件名称
SQLServer2005文件有两个名称:
logical_file_name:
logical_file_name是在所有Transact-SQL语句中引用物理文件时所使用的名称。
逻辑文件名必须符合SQLServer标识符规则,而且在数据库中的逻辑文件名中必须是唯一的。
os_file_name:
os_file_name是包括目录路径的物理文件名。
它必须符合操作系统文件命名规则。
下图显示了在默认SQLServer2005实例上创建的数据库的逻辑文件名和物理文件名示例:
SQLServer数据和日志文件可以保存在FAT或NTFS文件系统中。
从安全性角度建议使用NTFS。
可读/写数据文件组和日志文件不能保存在NTFS压缩文件系统中。
只有只读数据库和只读次要文件组可以保存在NTFS压缩文件系统中。
有关详细信息,请参阅只读文件组。
如果多个SQLServer实例在一台计算机上运行,则每个实例都会接收到不同的默认目录来保存在该实例中创建的数据库文件。
有关详细信息,请参阅SQLServer2005的默认实例和命名实例的文件位置。
数据文件页
SQLServer2005数据文件中的页按顺序编号,文件的首页以0开始。
数据库中的每个文件都有一个唯一的文件ID号。
若要唯一标识数据库中的页,需要同时使用文件ID和页码。
下例显示了包含4-MB主数据文件和1-MB次要数据文件的数据库中的页码。
每个文件的第一页是一个包含有关文件属性信息的文件的页首页。
在文件开始处的其他几页也包含系统信息(例如分配映射)。
有一个存储在主数据文件和第一个日志文件中的系统页是包含数据库属性信息的数据库引导页。
有关页和页类型的详细信息,请参阅页和区。
文件大小
SQLServer2005文件可以从它们最初指定的大小开始自动增长。
在定义文件时,您可以指定一个特定的增量。
每次填充文件时,其大小均按此增量来增长。
如果文件组中有多个文件,则它们在所有文件被填满之前不会自动增长。
填满后,这些文件会循环增长。
每个文件还可以指定一个最大大小。
如果没有指定最大大小,文件可以一直增长到用完磁盘上的所有可用空间。
如果SQLServer作为数据库嵌入某应用程序,而该应用程序的用户无法迅速与系统管理员联系,则此功能就特别有用。
用户可以使文件根据需要自动增长,以减轻监视数据库中的可用空间和手动分配额外空间的管理负担。
数据库文件组
为便于分配和管理,可以将数据库对象和文件一起分成文件组。
有两种类型的文件组:
主文件组
主文件组包含主数据文件和任何没有明确分配给其他文件组的其他文件。
系统表的所有页均分配在主文件组中。
用户定义文件组
用户定义文件组是通过在CREATEDATABASE或ALTERDATABASE语句中使用FILEGROUP关键字指定的任何文件组。
日志文件不包括在文件组内。
日志空间与数据空间分开管理。
一个文件不可以是多个文件组的成员。
表、索引和大型对象数据可以与指定的文件组相关联。
在这种情况下,它们的所有页将被分配到该文件组,或者对表和索引进行分区。
已分区表和索引的数据被分割为单元,每个单元可以放置在数据库中的单独文件组中。
有关已分区表和索引的详细信息,请参阅已分区表和已分区索引。
每个数据库中均有一个文件组被指定为默认文件组。
如果创建表或索引时未指定文件组,则将假定所有页都从默认文件组分配。
一次只能有一个文件组作为默认文件组。
db_owner固定数据库角色成员可以将默认文件组从一个文件组切换到另一个。
如果没有指定默认文件组,则将主文件组作为默认文件组。
文件和文件组示例
以下示例在SQLServer实例上创建了一个数据库。
该数据库包括一个主数据文件、一个用户定义文件组和一个日志文件。
主数据文件在主文件组中,而用户定义文件组包含两个次要数据文件。
ALTERDATABASE语句将用户定义文件组指定为默认文件组。
然后通过指定用户定义文件组来创建表。
复制代码
USEmaster;
GO
--Createthedatabasewiththedefaultdata
--filegroupandalogfile.Specifythe
--growthincrementandthemaxsizeforthe
--primarydatafile.
CREATEDATABASEMyDB
ONPRIMARY
(NAME='
MyDB_Primary'
FILENAME=
'
c:
\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\data\MyDB_Prm.mdf'
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB),
FILEGROUPMyDB_FG1
(NAME='
MyDB_FG1_Dat1'
FILENAME=
\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\data\MyDB_FG1_1.ndf'
SIZE=1MB,
MyDB_FG1_Dat2'
\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\data\MyDB_FG1_2.ndf'
FILEGROWTH=1MB)
LOGON
MyDB_log'
\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\data\MyDB.ldf'
SIZE=1MB,
FILEGROWTH=1MB);
ALTERDATABASEMyDB
MODIFYFILEGROUPMyDB_FG1DEFAULT;
--Createatableintheuser-definedfilegroup.
USEMyDB;
CREATETABLEMyTable
(colaintPRIMARYKEY,
colbchar(8))
ONMyDB_FG1;
下图总结上述示例的结果。
SQLServer2005在为对象快速分配页及重新使用通过删除的行获得的空间上很有效。
这些操作是系统的内部操作,使用用户不可见的数据结构。
但SQLServer消息中偶尔还会引用这些进程和结构。
本部分概括介绍空间分配算法和数据结构。
它还为用户和管理员提供所需的相关知识,以便他们了解SQLServer生成的消息中所引用的术语。
本节的相关信息
主题
说明
管理区分配和可用空间
说明如何在SQLServer中分配和管理区以及如何管理数据库中的可用空间。
管理对象使用的空间
说明如何将数据库中的数据库对象映射到页和区。
跟踪已修改的区
介绍用于跟踪修改的扩展盘区的差异更改映射表(DCM)和大容量更改映射表(BCM)的结构。
请参阅
用来管理区分配情况并跟踪可用空间的SQLServer2005数据结构相对而言比较简单。
这有下列好处:
∙可用空间信息被紧密压缩,因此包含此信息的页相对较少。
这样,可提高速度,因为它减少了检索分配信息时所需的磁盘读取量。
同时还可增加分配页保留在内存中的机会并且不需要更多的读操作。
∙大多数分配信息不是链在一起的。
这就简化了对分配信息的维护。
可以快速执行每个页的分配或释放。
这将减少需要分配页或释放页的并发任务之间的争用。
管理区分配
SQLServer使用两种类型的分配映射表来记录区的分配:
∙全局分配映射表(GAM)
GAM页记录已分配的区。
每个GAM包含64,000个区,相当于近4GB的数据。
GAM用一个位来表示所涵盖区间内的每个区的状态。
如果位为1,则区可用;
如果位为0,则区已分配。
∙共享全局分配映射表(SGAM)
SGAM页记录当前用作混合区且至少有一个未使用的页的区。
每个SGAM包含64,000个区,相当于近4GB的数据。
SGAM用一个位来表示所涵盖区间内的每个区的状态。
如果位为1,则区正用作混合区且有可用页。
如果位为0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。
根据区当前的使用情况,GAM和SGAM中每个区具有以下位模式。
区的当前使用情况
GAM位设置
SGAM位设置
可用,未使用
1
统一区或已满的混合区
具有可用页的混合区
这将简化区管理算法。
若要分配统一区,数据库引擎
将在GAM中搜索为1的位,并将其设置为0。
若要查找具有可用页的混合区,数据库引擎
将在SGAM中搜索为1的位。
若要分配混合区,数据库引擎
将在GAM中搜索为1的位,将其设置为0,然后将SGAM中对应的位设置为1。
若要释放区,数据库引擎
确保将GAM位设置为1,将SGAM位设置为0。
实际上,数据库引擎
内部使用的算法比本主题中介绍的更为复杂,因为数据库引擎
在数据库中均匀分布数据。
但是,由于无需管理区分配信息链,因此即使是实际算法也会被简化。
跟踪可用空间
页可用空间(PFS)页记录每页的分配状态,是否已分配单个页以及每页的可用空间量。
PFS对每页都有一个字节,记录该页是否已分配。
如果已分配,则记录该页是为空、已满1%到50%、已满51%到80%、已满81%到95%还是已满96%到100%。
将区分配给对象后,数据库引擎
将使用PFS页来记录区中的哪些页已分配或哪些页可用。
数据库引擎
必须分配新页时,将使用此信息。
保留的页中的可用空间量仅用于堆和Text/Image页。
必须找到一个具有可用空间的页来保存新插入的行时,使用此信息。
索引不要求跟踪页的可用空间,因为插入新行的点是由索引键值设置的。
在数据文件中,PFS页是文件头页之后的第一页(页码为1)。
接着是GAM页(页码为2),然后是SGAM页(页码为3)。
第一个PFS页之后是一个大小大约为8,000页的PFS页。
在第2页上,第一个GAM页之后是一个有64,000个区的GAM页;
在第3页上,第一个SGAM页之后是一个有64,000个区的SGAM页。
下图显示了数据库引擎分配和管理区所用的页的顺序。
索引分配映射(IAM)页映射分配单元使用的数据库文件的4GB部分中的区。
分配单元有下列三种类型:
∙IN_ROW_DATA
用于存储堆分区或索引分区。
∙LOB_DATA
用于存储大型对象(LOB)数据类型,例如xml、varbinary(max)和varchar(max)。
∙ROW_OVERFLOW_DATA
用于存储超过8,060字节行大小限制的varchar、nvarchar、varbinary或sql_variant列中存储的可变长度数据。
堆或索引的每个分区至少包含一个IN_ROW_DATA分配单元。
根据堆或索引的架构,可能还包含一个LOB_DATA或ROW_OVERFLOW_DATA分配单元。
有关分配单元的详细信息,请参阅表组织和索引组织。
一个IAM页在文件中的范围为4GB,与GAM或SGAM页的范围相同。
如果分配单元包含来自多个文件的区,或者超过一个文件的4GB范围,那么一个IAM链中将链接多个IAM页。
因此,每个分配单元在有区的每个文件中至少有一个IAM页。
如果分配给分配单元的文件中的区的范围超过了一个IAM页能够记录的范围,一个文件中也可能会有多个IAM页。
IAM页根据需要分配给每个分配单元,在文件中的位置也是随机的。
系统视图(sys.system_internals_allocation_units)指向分配单元的第一个IAM页。
该分配单元的所有IAM页都链接到一个链中。
重要事项:
sys.system_internals_allocation_units系统视图仅供内部使用,随时可能更改。
不保证兼容性。
IAM页有一个标头,指明IAM页所映射的区范围的起始区。
IAM页中还有一个大位图,其中每个位代表一个区。
位图中的第一个位代表范围内的第一个区,第二个位代表第二个区,依此类推。
如果某个位是0,它所代表的区将不会分配给拥有该IAM页的分配单元。
如果这个位是1,它所代表的区将被分配给拥有该IAM页的分配单元。
当数据库引擎
需要插入新行,而当前页中没有可用空间时,它将使用IAM和PFS页查找要分配的页,或者(对于堆或Text/Image页)查找具有足够空间容纳该行的页。
使用IAM页查找分配给分配单元的区。
对于每个区,数据库引擎
将搜索PFS页,以查看是否有可用的页。
每个IAM和PFS页覆盖大量数据页,因此一个数据库内只有很少的IAM和PFS页。
这意味着IAM和PFS页通常位于内存中的SQLServer缓冲池中,所以能够很快找到它们。
对于索引,新行的插入点由索引键设置。
在这种情况下,不会出现上述搜索过程。
只有当数据库引擎无法在现有区内快速找到具有足够空间容纳要插入的行的页时,才会为分配单元分配一个新区。
使用比例分配算法从文件组的可用区中分配区。
如果文件组内有两个文件,而一个文件的可用空间是另一个文件的两倍,那么每从后一个文件分配一页,就从前一个文件分配两页。
这意味着文件组内的每个文件应该有近似的空间使用百分比。
SQLServer2005使用两个内部数据结构跟踪被大容量复制操作修改的区,以及自上次完整备份后修改的区。
这些数据结构极大地加快了差异备份的速度。
当数据库使用大容量日志恢复模式时,这些数据结构也可以加快将大容量复制操作记录至日志的速度。
与全局分配图(GAM)和共享全局分配图(SGAM)页相同,这些结构也是位图,其中的每一位代表一个单独的区。
∙差异更改映射表(DCM)
这样便可以跟踪自上次执行BACKUPDATABASE语句后更改过的区。
如果扩展盘区的位是1,则自上次执行BACKUPDATABASE语句后扩展盘区已被修改。
如果位是0,则扩展盘区没有被修改。
差异备份只读取DCM页便可以确定已修改的区。
这样大大减少了差异备份必须扫描的页数。
运行差异备份所需的时间与自上次执行BACKUPDATABASE语句之后修改的区数成正比,而不是与整个数据库的大小成正比。
∙大容量更改映射表(BCM)
跟踪自上次执行BACKUPLOG语句后,被大容量日志记录操作修改的区。
如果某个扩展盘区的位是1,表明自上次执行BACKUPLOG语句后,该扩展盘区已经被有日志记录的大容量复制操作修改。
如果位是0,则该扩展盘区未被有日志记录的大容量复制操作修改。
尽管所有数据库中都显示BCM页,但只有在数据库使用大容量日志记录恢复模式时,才会与BCM页有关。
在此恢复模式中,当执行BACKUPLOG时,备份进程将扫描BCM查找已经修改的区。
然后,将那些区包括在日志备份中。
如果数据库从数据库备份和一系列事务日志备份恢复,便可以恢复大容量日志记录操作。
在使用简单恢复模式的数据库中,BCM页是不相关的,因为大容量日志记录操作不记入日志。
在使用完整恢复模式的数据库中,BCM页同样不相关,因为该恢复模式将大容量日志记录操作视为有完整日志记录的操作。
DCM页和BCM页的间隔与GAM和SGAM页的间隔相同,都是64,000个区。
在物理文件中,DCM和BCM页位于GAM和SGAM页之后。
SQLServer2005数据库中的对象存储为8KB页的集合。
本节说明如何组织、存储和访问表和索引页。
表组织和索引组织
说明如何组织表和索引页。
堆结构
说明如何将数据行存储在堆中,以及如何对其进行访问和维护。
聚集索引结构
说明如何将数据行存储在聚集索引中,以及如何对其进行访问和维护。
非聚集索引结构
说明如何将索引行存储在非聚集索引中,以及如何对其进行访问和维护。
表和索引作为8KB页的集合存储。
本主题介绍表页和索引页的组织方式。
表组织
下图显示了表的组织。
表包含在一个或多个分区中,每个分区在一个堆或一个聚集索引结构包含数据行。
堆页或聚集索引页在一个或多个分配单元中进行管理,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word SQLServer 物理 数据库 结构 详解