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
),
(sqlserver备份表语句
  NAME='MyDB_FG1_Data2',
  FILENAME='e:\...\MyDB_FG1_Data2.ndf',
  SIZE=4MB,
  MAXSIZE=10MB,
  FILEGROWTH=1MB
),