1.默认情况
一般创建数据库后,有两个文件,后缀分别为 .mdf(主要文件) 和 .ldf(日志文件) 默认只有一个文件组
2.添加文件组,文件组是用来放文件的(用户可以添加文件 后缀默认为 .ndf的文件)
3.添加文件
4.为什么用文件组
对于用户角度来说,需对创建的对象指定存储的文件组只有三种数据对象:表,索引和大对象(LOB)
使用文件组可以隔离用户和文件,使得用户针对文件组来建立表和索引,而不是实际磁盘中的文件。当文件移动或修改时,由于用户建立的表和索引是建立在文件组上的,并不依赖具体文件,这大大加强了可管理性.
还有一点是,使用文件组来管理文件可以使得同一文件组内的不同文件分布在不同的硬盘中,极大的提高了IO性能.
SQL SERVER会根据每个文件设置的初始大小和增长量会自动分配新加入的空间,假设在同一文件组中的文件A设置的大小为文件B的两倍,新增一个数据占用三页(Page),则按比例将2页分配到文件A中,1页分配到文件B中.(必须文件和文件在同一个文件组中)
5.为什么用文件(.ndf)
可以缓解磁盘压力,将表数据分散在不同的磁盘位置,提升IO性能,特别是在有做 磁盘阵列 的服务器上
6.利弊
同时,因为每个文件中都有自己的一套B树组织方式和自己的增长空间,所以,使用多文件需要占用更多的磁盘空间。
7.示例
--当前数据库,查询文件组、文件
SELECT df.[name],df.physical_name,df.[size],
df.[growth],f.[name] AS [filegroup],f.[is_default]
FROM sys.database_files df
LEFT JOIN sys.filegroups f
ON df.data_space_id = f.data_space_id
--当前数据库,数据文件占用与剩余空间
SELECT DB_NAME() AS DbName,
name AS FileName,
size/128.0 AS CurrentSizeMB,
size/128.0 - CAST(FILEPROPERTY(name, ‘SpaceUsed‘) AS INT)/128.0 AS FreeSpaceMB
FROM sys.database_files;
未添加数据之前(剩余空间)
---添加数据:
--测试数据
DECLARE @num INT=0
WHILE @num<200000
BEGIN
INSERT INTO TempA VALUES(222)
SET @num=@num+1
END
---添加后:
由此可以看出,数据被分散到同一文件组下的 两个文件中了,文件增长空间是:当前文件组下的所有文件空间都满了才会去按增长量 增长当前需要写入的文件空间