文件和文件组体系结构
ps:msdn摘入
SQL Server 将数据库映射为一组操作系统文件。数据和日志信息绝不会混合在同一个文件中,而且一个文件只由一个数据库使用。
数据库文件
SQL Server 数据库具有三种类型的文件:
1.主数据文件:主数据文件是数据库的起点,指向数据库中的其他文件。每个数据库都有一个主数据文件。主数据文件的推荐文件扩展名是 .mdf。
2.次要数据文件:除主数据文件以外的所有其他数据文件都是次要数据文件。某些数据库可能不含有任何次要数据文件,而有些数据库则含有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
3.日志文件:日志文件包含着用于恢复数据库的所有日志信息。每个数据库必须至少有一个日志文件,当然也可以有多个。日志文件的推荐文件扩展名是 .ldf。
ps:在 SQL Server 中,数据库中所有文件的位置都记录在数据库的主文件和 master 数据库中。大多数情况下,SQL Server 数据库引擎使用 master 数据库中的文件位置信息.
疑惑:为何在一盘符将数据库分成多个数据库文件,也可以说 为何要拥有次要数据文件?
首先明确这样做不会对性能有所提高,因为它是在一个物理盘符上的,但是它可以提供灵活性
1.还原的时候的灵活性:还原数据库的个数是1:1的.如果你本来的数据库文件只有一个,那么你就只能还原这个文件.同理,你如果有4个数据库文件,那么就要还原出4个一样的文件.问题就在于如果你的单个数据库文件过大,
比如100G,但是你没这么大的一个硬盘给你恢复,那么你就没办法.但是如果当时你用的是4个数据库文件来分担你的这个数据库,假设它都是25G大小.这个时候如果找不到100G的大硬盘,那你可以去找几个比25G大小的
硬盘就可以了。
2.可以方便地将数据库迁移到不同驱动器.
逻辑和物理文件名称
SQL Server 文件有两个名称:
a:逻辑文件名称(logical_file_name) :是在所有 Transact-SQL 语句中引用物理文件时所使用的名称。逻辑文件名必须符合 SQL Server 标识符规则,而且在数据库中的逻辑文件名中必须是唯一的。
b.物理文件名称(os_file_name) :是包括目录路径的物理文件名。它必须符合操作系统文件命名规则。
ps:SQL Server 数据和日志文件可以保存在 FAT 或 NTFS 文件系统中。由于 NTFS 在安全方面具有优势,因此,我们建议您使用 NTFS 文件系统.
如果多个 SQL Server 实例在一台计算机上运行,则每个实例都会接收到不同的默认目录来保存在该实例中创建的数据库文件.
关于SQL Server 的默认实例和命名实例的文件位置 --http://blog.csdn.net/feixianxxx/archive/2010/01/28/5267265.aspx
数据库文件组
为便于分配和管理,可以将数据库对象和文件一起分成文件组。
使用文件组的好处:文件组允许对文件进行分组,以便于管理和数据的分配/放置。
1例如,可以分别在三个硬盘驱动器上创建三个文件(Data1.ndf、Data2.ndf和Data3.ndf),并将这三个文件指派到文件组fgroup1中。然后,可以明确地在文件组fgroup1上创建一个表。
对表中数据的查询将分散到三个磁盘 上,3个读/写磁头可以同时并行地访问数据。这样可以加快数据库操作的速度。
2文件和文件组还允许数据布局,因为可以在特定的文件组中创建表。这样可以改善性能,因为可以将特定表的所有 I/O 都定向到一个特定的磁盘。
3当使用多个文件组时,可以分别备份和还原数据库中的文件(段落还原)。例如,如果一个数据库由几个分别位于不同的物理磁盘上的文件组成,当其中一个磁盘发生故障时,只需还原发生故障的磁盘上的文件。
有两种类型的文件组:
1.主文件组 :包含主数据文件和任何没有明确分配给其他文件组的其他文件。系统表的所有页均分配在主文件组中。
2.用户定义文件组 :用户定义文件组是通过在 CREATE DATABASE 或 ALTER DATABASE 语句中使用 FILEGROUP 关键字指定的任何文件组。
ps:日志文件不包括在文件组内。日志空间与数据空间分开管理。
相关概念:a.一个文件不可以是多个文件组的成员。
b.每个数据库中均有一个文件组被指定为默认文件组。如果没有指定默认文件组,则将主文件组作为默认文件组。
如果创建表或索引时未指定文件组,则将假定所有页都从默认文件组分配。一次只能有一个文件组作为默认文件组。
c.事务日志文件不能属于任何文件组。
下面是使用文件和文件组时的一些一般建议:
1大多数数据库在只有单个数据文件和单个事务日志文件的情况下性能良好。
2.如果使用多个文件,请为附加文件创建第二个文件组,并将其设置为默认文件组。这样,主文件将只包含系统表和对象。
3若要使性能最大化,请在尽可能多的不同的可用本地物理磁盘上创建文件或文件组。将争夺空间最激烈的对象置于不同的文件组中。
4使用文件组将对象放置在特定的物理磁盘上。
5将在同一联接查询中使用的不同表置于不同的文件组中。由于采用并行磁盘 I/O 对联接数据进行搜索,所以性能将得以改善。
6将最常访问的表和属于这些表的非聚集索引置于不同的文件组中。如果文件位于不同的物理磁盘上,由于采用并行 I/O,所以性能将得以改善。
7请勿将事务日志文件置于其中已有其他文件和文件组的物理磁盘上。
8如果有些表不允许修改,可以将它们放入文件组中,然后将这些文件组标记为只读。这可以防止意外的更新.
文件和文件组示例:
以下示例在 SQL Server 实例上创建了一个数据库。
该数据库包括一个主数据文件、一个用户定义文件组和一个日志文件。
主数据文件在主文件组中,而用户定义文件组包含两个次要数据文件。
USE master;
GO
CREATE DATABASE MyDB
ON PRIMARY
( NAME='MyDB_Primary',
FILENAME=
'c:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/data/MyDB_Prm.mdf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB),
FILEGROUP MyDB_FG1
( NAME = 'MyDB_FG1_Dat1',
FILENAME =
'c:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/data/MyDB_FG1_1.ndf',
SIZE = 1MB,
MAXSIZE=10MB,
FILEGROWTH=1MB),
( NAME = 'MyDB_FG1_Dat2',
FILENAME =
'c:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/data/MyDB_FG1_2.ndf',
SIZE = 1MB,
MAXSIZE=10MB,
FILEGROWTH=1MB)
LOG ON
( NAME='MyDB_log',
FILENAME =
'c:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/data/MyDB.ldf',
SIZE=1MB,
MAXSIZE=10MB,
FILEGROWTH=1MB);
GO
ALTER DATABASE 语句将用户定义文件组指定为默认文件组。然后通过指定用户定义文件组来创建表。
ALTER DATABASE MyDB
MODIFY FILEGROUP MyDB_FG1 DEFAULT;
GO
--建表
USE MyDB;
CREATE TABLE MyTable
( cola int PRIMARY KEY,
colb char(8) )
ON MyDB_FG1;
GO