SQLServer文件组(一)
使用文件组开发数据库的好处
使用文件组开发数据库可以改善数据库的性能。
首先,文件组允许跨多个磁盘、多个磁盘控制器或RAID(独立磁盘冗余阵列)系统创建数据库。例如,如果你的计算机上有四个磁盘,在每个磁盘上放一个文件,那么你可以创建一个由三个数据文件和一个日志文件组成的数据库。当用户对数据进行访问时,磁盘上的四个读/写磁头可以同时并行地访问数据。这一动作加快了数据库操作的速度。
其次,文件组允许数据布局,即可以在特定文件组中创建表。例如,我们设计的数据库中总有常访问的表和不常访问的表。可以将常访问的表放在一个文件组的一个文件中,且该文件位于一个磁盘上。将不常访问的表放在另一个文件组的一个文件中,且该文件位于另一个磁盘上。这样可以将特定表的所以输入输出(I/O)都定向到一个特定的磁盘,竟而改善性能。
再次,利于实现备份和还原策略。可以通过称为段落还原的进程分阶段还原由多个文件组组成的数据库。段落还原适用于所有恢复模式,但在完整恢复模式和大容量日志恢复模式下比在简单恢复模式下更灵活。段落还原方案包括还原的全部三个阶段:数据复制、重做或前滚以及撤消或后滚。当使用多个文件组时,可以分别备份和还原数据库中的文件。在简单恢复模式下,只能对只读文件进行文件备份。使用文件备份使您能够只还原损坏的文件,而不用还原数据库的其余部分,从而加快了恢复速度。例如,如果一个数据库由几个分别位于不同的物理磁盘上的文件组成,当其中一个磁盘发生故障时,只需还原发生故障的磁盘上的文件。
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 数据库在线。数据现已压缩,可用于只读访问。