SQLServer文件组(一)数据库
使用文件组开发数据库的好处布局
使用文件组开发数据库能够改善数据库的性能。性能
首先,文件组容许跨多个磁盘、多个磁盘控制器或RAID(独立磁盘冗余阵列)系统建立数据库。例如,若是你的计算机上有四个磁盘,在每一个磁盘上放一个文件,那么你能够建立一个由三个数据文件和一个日志文件组成的数据库。当用户对数据进行访问时,磁盘上的四个读/写磁头能够同时并行地访问数据。这一动做加快了数据库操做的速度。大数据
其次,文件组容许数据布局,便可以在特定文件组中建立表。例如,咱们设计的数据库中总有常访问的表和不常访问的表。能够将常访问的表放在一个文件组的一个文件中,且该文件位于一个磁盘上。将不常访问的表放在另外一个文件组的一个文件中,且该文件位于另外一个磁盘上。这样能够将特定表的因此输入输出(I/O)都定向到一个特定的磁盘,竟而改善性能。spa
再次,利于实现备份和还原策略。能够经过称为段落还原的进程分阶段还起因多个文件组组成的数据库。段落还原适用于全部恢复模式,但在完整恢复模式和大容量日志恢复模式下比在简单恢复模式下更灵活。段落还原方案包括还原的所有三个阶段:数据复制、重作或前滚以及撤消或后滚。当使用多个文件组时,能够分别备份和还原数据库中的文件。在简单恢复模式下,只能对只读文件进行文件备份。使用文件备份使您可以只还原损坏的文件,而不用还原数据库的其他部分,从而加快了恢复速度。例如,若是一个数据库由几个分别位于不一样的物理磁盘上的文件组成,当其中一个磁盘发生故障时,只需还原发生故障的磁盘上的文件。操作系统
SQLServer文件组(二)设计
文件和文件组概念日志
SQL Server 将数据库映射为一组操做系统文件。数据和日志信息毫不会混合在同一个文件中,并且一个文件只由一个数据库使用。文件组是命名的文件集合,用于帮助数据布局 和管理任务,例如备份和还原操做。对象
数据库文件索引
SQL Server 数据库具备三种类型的文件:
主数据文件
主数据文件是数据库的起点,指向数据库中的其余文件。每一个数据库都有一个主数据文件。主数据文件的推荐文件扩展名是 .mdf。
次要数据文件
除主数据文件之外的全部其余数据文件都是次要数据文件。某些数据库可能不含有任何次要数据文件,而有些数据库则含有多个次要数据文件。次要数据文件的推荐 文件扩展名是 .ndf。
日志文件
日志文件包含着用于恢复数据库的全部日志信息。每一个数据库必须至少有一个日志文件,固然也能够有多个。日志文件的推荐文件扩展名是 .ldf。
SQL Server 不强制使用 .mdf、.ndf 和 .ldf 文件扩展名,但使用它们有助于标识文件的各类类型和用途。
数据文件页
SQL Server 数据文件中的页按顺序编号,文件的首页以 0 开始。数据库中的每一个文件都有一个惟一的文件 ID 号。若要惟一标识数据库中的页,须要同时使用文件 ID 和页码。
每一个文件的第一页是一个包含有关文件属性信息的文件的页首页。在文件开始处的其余几页也包含系统信息(例如分配映射)。有一个存储在主数据文件和第一个日志文 件中的系统页是包含数据库属性信息的数据库引导页。
SQL Server 文件能够从它们最初指定的大小开始自动增加。在定义文件时,您能够指定一个特定的增量。每次填充文件时,其大小均按此增量来增加。若是文件组中有多个文 件,则它们在全部文件被填满以前不会自动增加。填满后,这些文件会循环增加。
每一个文件还能够指定一个最大大小。若是没有指定最大大小,文件 能够一直增加到用完磁盘上的全部可用空间。若是 SQL Server 做为数据库嵌入某应用程序,而该应用程序的用户没法迅速与系统管理员联系,则此功能就特别有用。用户可使文件根据须要自动增加,以减轻监视数据库中的可 用空间和手动分配额外空间的管理负担。
数据库文件组
能够在首次建立数据库时建立文件组,也能够在之后在数据库中添加更多文件时建立文件组。可是,一旦将文件添加到数据库中,就不能再将这些文件移到其 他文件组中。
最多能够为每一个数据库建立 32,767 个文件组。文件组只能包含数据文件。事务日志文件不能是文件组的一部分。
文件组不能独立于数据库文件建立。文件组是在数据库中组织文件的一种管理机制。
为便于分配和管理,能够将数据库对象和文件一块儿分红文件组。有两种类型的文件组:
主文件组
主文件组包含主数据文件和任何没有明确分配给其余文件组的其余文件。系统表的全部页均分配在主文件组中。
用户定义文件组
用户定义文件组是经过在 CREATE DATABASE 或 ALTER DATABASE 语句中使用 FILEGROUP 关键字指定的任何文件组。
日志文件不包括在文件组内。日志空间与数据空间分开管理。
一个文件不能够是多个文件组的成员。表、索引和大型对象数据能够与指定的文件组相关联。在这种状况下,它们的全部页将被分配到该文件组,或者对表和索引进行分区。已分区表和索引的数据被分割为单元,每一个单元能够放置在数据库中的单独文件组中。
默认文件组
每一个数据库中均有一个文件组被指定为默认文件组。若是建立表或索引时未指定文件组,则将假定全部页都从默认文件组分配。一次只能有一个文件组做为默认文件组。dbowner 固定数据库角色成员能够将默认文件组从一个文件组切换到另外一个。若是没有指定默认文件组,则将主文件组做为默认文件组。
若是在数据库中建立对象时 没有指定对象所属的文件组,对象将被分配给默认文件组。无论什么时候,只能将一个文件组指定为默认文件组。默认文件组中的文件必须足够大,可以容纳未分配给其 他文件组的全部新对象。
PRIMARY 文件组是默认文件组,除非使用 ALTER DATABASE 语句进行了更改。但系统对象和表仍然分配给 PRIMARY 文件组,而不是新的默认文件组。
SQLServer文件组(三)
文件和文件组的填充
文件组对组内的全部文件都使用按比例填充策略。当数据写入文件组时,SQL Server 数据库引擎按文件中的可用空间比例将数据写入文件组中的每一个文件,而不是将全部数据都写入第一个文件直至其变满为止。而后再写入下一个文件。例如,若是文 件 f1 有 100 MB 可用空间,文件 f2 有 200 MB 可用空间,则从文件 f1 中分配一个区,从文件 f2 中分配两个区,依此类推。这样,两个文件几乎同时填满,而且可得到简单的条带化。
假定将数据库设置为自动增加,则当文件组中的全部文件填满后,数据库引擎便 会采用循环方式一次自动扩展一个文件以容纳更多数据。例如,某个文件组由三个文件组成,它们都设置为自动增加。当文件组中全部文件的空间都已用完时,只扩展第一个文件。当第一个文件已满,没法再向文件组中写入更多数据时,将扩展第二个文件。当第二个文件已满,没法再向文件组中写入更多数据时,将扩展第三个文件。当第三个文件已满,没法再向文件组中写入更多数据时,将再次扩展第一个文件,依此类推。
使用文件和文件组管理数据库增加
建立数据库时,必须指定数据和日志 文件的初始大小,或采用默认大小。随着数据不断地添加到数据库,这些文件将逐渐变满。然而,若是添加到数据库中的数据多于文件的容量,就须要考虑数据库在 超过所分配初始空间的状况下是否增加以及如何增加。
默认状况下,数据文件根据须要一直增加,直到没有剩余的磁盘空间。所以,若是不但愿数据 库文件的大小增加到大于建立时的初始值,则必须在使用 SQL Server Management Studio 或 CREATE DATABASE 语句建立数据库时指定其大小。
另外,SQL Server 使您能够建立在填充数据时可以自动增加的数据文件,但只能增加到预约义的最大值。这能够防止彻底耗尽磁盘驱动器的空间。
建议
在建立数据库时,请根据数据库中预期的最大数据量,建立尽量大的数据文 件。容许数据文件自动增加,但要有必定的限度。为此,须要指定数据文件增加的最大值,以便在硬盘上留出一些可用空间。这样即可以使数据库在添加超过预期的 数据时增加,而不会填满磁盘驱动器。若是已经超过了初始数据文件的大小而且文件开始自动增加,则从新计算预期的数据库大小最大值。而后,根据计划添加更多 的磁盘空间,若是须要,在数据库中建立并添加更多的文件或文件组。
然而,若是假定不使数据库增加到超过其初始值,请将数据库增加的最大值设置 为零。这将防止数据库文件增加。若是数据库文件已填满数据,那么只有为数据库添加更多的数据文件或扩展示有的文件后,才能添加更多的数据。
文件碎片
若是若干文件共享同一个磁盘,则让文件自动增加可能会致使那些文件产生碎 片。所以,应尽量的在不一样的本地物理磁盘上建立文件或文件组。此外,还要将争夺空间最激烈的对象放置在不一样的文件组中。
SQLServer文件组(四)
文件和文件组示例
如下示例在 SQL Server 实例上建立了一个数据库。该数据库包括一个主数据文件、两个用户定义文件组和一个日志文件。主数据文件在主文件组中,而用户定义文件组包含两个次要数据文 件。ALTER DATABASE 语句将用户定义文件组指定为默认文件组。而后经过指定用户定义文件组来建立表。
--Create the database with the dafault
--data filegroup and a log file.
--Specify the growth increment and
--the max size for the primary data file.
CREATE DATABASE MyDatabase
ON PRIMARY
(
NAME='MyDB_Primary',
FILENAME='d:\...\MyDB_Primary.mdf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
FILEGROUP MyDB_FG1
(
NAME='MyDB_FG1_Data1',
FILENAME='e:\...\MyDB_FG1_Data1.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
(
NAME='MyDB_FG1_Data2',
FILENAME='e:\...\MyDB_FG1_Data2.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
FILEGROUP MyDB_FG2
(
NAME='MyDB_FG2_Data1',
FILENAME='f:\...\MyDB_FG2_Data1.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
(
NAME='MyDB_FG2_Data1',
FILENAME='f:\...\MyDB_FG2_Data1.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
)
LOG ON
(
NAME='MyDB_Log',
FILENAME='g:\...\MyDB_Log.ldf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
)
GO
ALTER DATABASE MyDatabase
MODIFY FILEGROUP MyDB_FG1 DEFAULT
GO
--Create a table in the user-defined filegroup.
USE MyDatabase
GO
CREATE TABLE MyTable1
(
cola INT PRIMARY KEY,
colb CHAR(8)
)ON MyDB_FG1
GO
CREATE TABLE MyTable2
(
cola INT PRIMARY KEY,
colb CHAR(8)
)ON MyDB_FG2
GO
SQLServer文件组(五)
文件组的设计规则
一个文件或文件组不能由多个数据库使用。
一个文件只能是一个文件组的成员。
事务日志文件不能属于任何文件组。
使用文件和文件组的一些建议:
大多数数据库在只有单个数据文件和单个事务日志文件的状况下性能良好。
若是使用多个文件,请为附加文件建立第二个文件组,并将其设置为默认文件组。这样,主文件将只包含系统表和对象。
若要使性能最大化,请在尽量多的不一样的可用本地物理磁盘上建立文件或文件组。将争夺空间最激烈的对象置于不一样的文件组中。
使用文件组将对象放置在特定的物理磁盘上。
将在同一联接查询中使用的不一样表置于不一样的文件组中。因为采用并行磁盘 I/O 对联接数据进行搜索,因此性能将得以改善。
将最常访问的表和属于这些表的非汇集索引置于不一样的文件组中。若是文件位于不一样的物理磁盘上,因为采用并行 I/O,因此性能将得以改善。
请勿将事务日志文件置于其中已有其余文件和文件组的物理磁盘上。
SQLServer文件组(六)
只读文件组和压缩
文件组能够标记为只读。任何现有的 文件组(主文件组除外)均可以标记为只读。不能使用任何方式对标记为只读的文件组进行修改。能够压缩只读文件组。
对于不容许修改的表(如历 史数据),能够将它们置于文件组中,而后将这些文件组标记为只读。这能够防止意外的更新。
使用只读用户定义文件组和只读数据库的 NTFS 压缩
SQL Server 2005 支持只读用户定义文件组和只读数据库的 NTFS 压缩。应在下列情形下考虑压缩只读数据:
有大量的静态数据或历史数据必须限制为只读访问。
磁盘空间有限。
管理注意事项
仅支持 Windows NTFS 压缩。有关详细信息,请参阅 Windows NTFS 文件系统文档。
支持将存储在只读用户定义 (.NDF) 文件组中的用户数据进行数据压缩。除非数据库自身是只读的,不然没法压缩主文件组和事务日志。
若要压缩用户定义文件组文件,数据库必须处于离线状态。
若要压缩文件或验证文件的压缩状态,请使用 Windows COMPACT 命令或 Windows 资源管理器。有关详细信息,
没法压缩 SQL Server 系统数据库(如 master、model、msdb、resource 和 tempdb)。
SQL Server 备份和还原操做支持压缩文件组。无需对备份和还原的实施进行修改。操做系统压缩对备份和还原操做是透明的。
彻底支持 ALL SELECT 语句和只读操做。这些语句的执行时间将比非压缩文件组上相同语句的执行时间长。
若要修改压缩数据,必须解压缩文件并将文件组设置为读/写。
只读数据库的主文件组和用户定义文件组都可以压缩。必须使用 NTFS 压缩来压缩关联文件。
压缩文件组支持附加数据库操做。在分离数据库以前,必须将文件组设置为只读。在附加数据库以前,必须压缩文件。
辅助文件组压缩示例
在此示例中,销售订单事务从生产数据库转移到 SalesArchive(在 只读、压缩文件组上存储的存档数据库)。还将间歇性地搜索数据用于销售分析和预测,但不修改数据。
在为从生产数据库移动数据做准备时,数据库管理员 (DBA) 将在 SalesArchive 上建立一个读/写文件组 Sales01。Sales01 位于 NTFS 目录。
DBA 将从生产数据库复制销售订单事务来将基于 Sales01 文件组建立的表进行存档。
在 SalesArchive 数据库为全部用户服务后,DBA 将更改数据库并将 Sales01 文件组设置为只读,而后使数据库处于离线状态。
DBA 可使用 Windows COMPACT 命令来压缩 Sales01.ndf 文件。
DBA 使 SalesArchive 数据库在线。数据现已压缩,可用于只读访问。