转自:https://www.cnblogs.com/woodytu/p/5821827.html

参考:https://www.sqlskills.com/blogs/paul/files-and-filegroups-survey-results/

概要

那么你应该有多少个数据文件和文件组?没有正确的答案,而且甜蜜的地方会因你而异。

一些一般的经验法则:

  • 随着数据库变大,您将更需要多个文件和文件组
  • 多个文件组为您提供增强的可能性,以实现有针对性的灾难恢复,更轻松的可管理性和I / O子系统布局
  • 每个文件组至少应有2-4个文件,tempdb是一种特殊情况

无论您做什么,不要忘记测试以找出工作负载的最佳配置。

在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组。当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个文件:

  • 一个数据文件(.mdf)
  • 一个事务日志文件(.ldf)

数据文件本身在有且只有一个主文件组里创建。默认情况下,在主文件组里,SQL Server存储素有的数据(用户表,系统表等)。那有额外的文件和文件组的目的是什么?我们来看下。

多个文件组

当你为你的数据创建额外的文件组,你可以在它们里面存储你定义的表和索引,这个会在多个方面帮助你

  • 你可以保持你的主文件组很小。
  • 你可以把你的数据分割到多个文件组(例如,你可以在企业版里使用文件分区)。
  • 你可以在文件组级别进行备份和还原操作。这给你在你的备份和还原策略上更多细粒度的控制。
  • 你可以在文件组级别运行DBCC CHECKDB命令,而不是数据库级别。

通常,你应该至少有一个从文件组,这里你可以存储你自己创建的数据库对象。你不应该在主文件组里存储SQL Server为你创建的其他系统对象。

多个文件

当你创建了你自己的文件组,你也要至少放一个文件进去。另外,你可以增加额外的文件到文件组。这也会提高你的负荷性能,因为SQL Server会散步数据在所有的文件间,即所谓的轮询调度分配算法(Round Robin Allocation Algorithm)。第一个64K在第一个文件存储,第二个64k在第二个文件存储,第三个区在第一个文件存储(在你的文件组里,你有2个文件时)。

使用这个方法,SQL Server可以在缓冲池里闩锁分配位图页(PFS,GAM,SGAM)的多个副本,并提高你的负荷性能。你也可以用这个方法解决在TempDb里默认配置的同个问题。另外,SQL Server也会确保文件组的所有文件在同一时间点满——通过所谓的比例填充算法(Proportional Fill Algorithm)。因此,在文件组里你的所有文件有同样的初始大小和自动增长参数非常重要。不然轮询调度分配算法就不能正常工作。

实例演示

现在我们来看下一个实例,如何创建额外文件组里有多个文件在里面的数据库。下列代码展示了你必须用到的CREATE DATABASE命令来完成这个任务。

  1. -- Create a new database
  2. CREATE DATABASE MultipleFileGroups ON PRIMARY
  3. (
  4. -- Primary File Group
  5. NAME = 'MultipleFileGroups',
  6. FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups.mdf',
  7. SIZE = 5MB,
  8. MAXSIZE = UNLIMITED,
  9. FILEGROWTH = 1024KB
  10. ),
  11. -- Secondary File Group
  12. FILEGROUP FileGroup1
  13. (
  14. -- 1st file in the first secondary File Group
  15. NAME = 'MultipleFileGroups1',
  16. FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups1.ndf',
  17. SIZE = 1MB,
  18. MAXSIZE = UNLIMITED,
  19. FILEGROWTH = 1024KB
  20. ),
  21. (
  22. -- 2nd file in the first secondary File Group
  23. NAME = 'MultipleFileGroups2',
  24. FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups2.ndf',
  25. SIZE = 1MB,
  26. MAXSIZE = UNLIMITED,
  27. FILEGROWTH = 1024KB
  28. )
  29. LOG ON
  30. (
  31. -- Log File
  32. NAME = 'MultipleFileGroups_Log',
  33. FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups.ldf',
  34. SIZE = 5MB,
  35. MAXSIZE = UNLIMITED,
  36. FILEGROWTH = 1024KB
  37. )
  38. GO
  39.  
  40. -------------向现有数据库添加文件组和文件
  1. --使用sql语句添加文件组和数文件
  2. --向E_Market数据库进行操作
  3. USE E_Market
  4. --添加组FG5
  5. ALTER DATABASE E_Market ADD FILEGROUP FG5
  6. GO
  7. --为新建的文件组添加数据文件
  8. ALTER DATABASE E_Market ADD FILE
  9. (
  10. name='FG5_E_Market_tada', --数据文件逻辑名称
  11. filename='F:\Prejoct\FG5_E_Market_tada.ndf', --存放位置--辅助数据文件
  12. size=5MB, --文件初始大小5mb
  13. FILEGROWTH=10%, --按百分之10增长
  14. MAXSIZE=500MB --最大考验增到500mb
  15. )
  16. TO FILEGROUP FG5
  17.  
  18. --将FG5设为默认文件组
  19. ALTER DATABASE E_Market
  20. MODIFY FILEGROUP FG5 DEFAULT
  21. GO
  22.  
  23. 设为默认文件组就是等于在创建文件的时候,默认文件组是为FG5

创建完数据库后,问题是如何把表或索引放到特定的文件组?你可以用ON关键字人为制定文件组,如下代码所示:

  1. CREATE TABLE Customers
  2. (
  3. FirstName CHAR(50) NOT NULL,
  4. LastName CHAR(50) NOT NULL,
  5. Address CHAR(100) NOT NULL,
  6. ZipCode CHAR(5) NOT NULL,
  7. Rating INT NOT NULL,
  8. ModifiedDate DATETIME NOT NULL,
  9. )
  10. ON [FileGroup1]
  11. GO

另一个选项,你标记特定文件组为默认文件组。然后SQL Server自动创建新的数据库对象在没有指定ON关键字的文件组里。

  1. -- FileGroup1 gets the default filegroup, where new database objects
  2. -- will be created
  3. ALTER DATABASE MultipleFileGroups MODIFY FILEGROUP FileGroup1 DEFAULT
  4. GO

这是我通常推荐的方法,因为你不需要再考虑,在创建完你的数据库对象后。因此现在让我们创建一个新的表,它会自动存储在FileGroup1文件组。

  1. -- The table will be created in the file group "FileGroup1"
  2. CREATE TABLE Test
  3. (
  4. Filler CHAR(8000)
  5. )
  6. GO

现在我们进行简单的测试:我们插入40000条记录到表。每条记录8K大小。因此我们插入了320MB数据到表。这是我刚才提的轮询调度分配算法,会进行操作:SQL Server会在2个文件间发放数据:第一个文件有160M的数据,第二个文件也会有160M的数据。

  1. -- Insert 40.000 records, results in about 312MB data (40.000 x 8KB / 1024 = 312,5MB)
  2. -- They are distributed in a round-robin fashion between the files in the file group "FileGroup1"
  3. -- Each file will get about 160MB
  4. DECLARE @i INT = 1
  5. WHILE (@i <= 40000)
  6. BEGIN
  7. INSERT INTO Test VALUES
  8. (
  9. REPLICATE('x', 8000)
  10. )
  11.  
  12. SET @i += 1
  13. END
  14. GO

接下来你可以在硬盘上看下,你会看到2个文件时同样的大小。

当你把这些文件放在不同的物理硬盘上,你可以同时访问它们。那就是在一个文件组里有多个文件的强大。

你也可以使用下列脚本获取数据库文件的相关信息。

  1. --查看数据库文件与文件组信息
  2. SELECT
  3. name as [database_name],
  4. COUNT (*) AS [DataFiles],
  5. COUNT (DISTINCT data_space_id) AS [Filegroups],
  6. SUM (size)*8/1024 AS [Size(MB)] --default Kb
  7. FROM sys.master_files
  8. WHERE [type_desc] = N'ROWS' -- filter out log files/data_space_id 0
  9. AND [database_id] > 0 -- filter out system databases
  10. AND [FILE_ID] != 65537 -- filter out FILESTREAM
  11. GROUP BY [database_id],name;
  12. GO

  

  1. -- Retrieve file statistics information about the created database files
  2. DECLARE @dbId INT
  3. SELECT @dbId = database_id FROM sys.databases WHERE name = 'MultipleFileGroups'
  4.  
  5. SELECT
  6. sys.database_files.type_desc,
  7. sys.database_files.physical_name,
  8. sys.dm_io_virtual_file_stats.* FROM sys.dm_io_virtual_file_stats
  9. (
  10. @dbId,
  11. NULL
  12. )
  13. INNER JOIN sys.database_files ON sys.database_files.file_id = sys.dm_io_virtual_file_stats.file_id
  14. GO

sql server 里的文件和文件组使用的更多相关文章

  1. SQL Server里在文件组间如何移动数据?

    平常我不知道被问了几次这样的问题:“SQL  Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多 ...

  2. SQL Server里的文件和文件组

    在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...

  3. SQL Server 2008中删除errorlog文件的方法

    删除error咯个文件[SSQL\MSSQL10.MSSQLSERVER\MSSQL\Log目录下面] 由于默认情况下,SQL Server 保存 7 个 ErrorLog 文件,名为: ErrorL ...

  4. SQL Server里的闩锁介绍

    在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...

  5. SQL Server里一些未公开的扩展存储过程

    SQL Server里一些未公开的扩展存储过程 [转帖] 博客天地 www.inbaidu.com SQL Server里一些未公开的扩展存储过程 扩展存储过程(xp)是直接运行在SQL Server ...

  6. 在SQL Server里我们为什么需要意向锁(Intent Locks)?

    在1年前,我写了篇在SQL Server里为什么我们需要更新锁.今天我想继续这个讨论,谈下SQL Server里的意向锁,还有为什么需要它们. SQL Server里的锁层级 当我讨论SQL Serv ...

  7. 在SQL Server里为什么我们需要更新锁

    今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...

  8. 在SQL Server里如何进行页级别的恢复

    在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作.假设在SQL Server里你有一个损坏的页,你要从最近的数据库备份只还原有问题的页,而不是还原 ...

  9. SQL Server里强制参数化的痛苦

    几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Par ...

随机推荐

  1. Android Intent 教程

    原文:Android: Intents Tutorial 作者:Darryl Bayliss 译者:kmyhy 人不会漫无目的地瞎逛,他们所做的大部分事情--比方看电视.购物.编写下一个杀手级 app ...

  2. Shell脚本中$0、$?、$!、$$、$*、$#、$@等的意义

    http://blog.csdn.net/slovyz/article/details/47400107

  3. elastic-job(lite)使用的一些注意事项

    前段时间项目开发中用到了当当开源的elastic-job,使用过程遇到一些问题,虽然不见得会影响写代码,但作为一个致力于搬好每一块砖的码农,当碰到问题时,我们不应该逃避,应该本着有困难也要上,没有困难 ...

  4. Android开发之程序猿必需要懂得Android的重要设计理念2(5.20更新版)

    上篇文章介绍了Android开发的设计理念的一部分,并没有得到博友们的多大认可,仅仅看到了一位博友在以下留言期待下一篇文章的发表,为了这小小的唯一支持.我决定继续把后面的8个要点介绍一下,自己也潜心反 ...

  5. day15<集合框架>

    集合框架(对象数组的概述和使用) 集合框架(集合的由来及集合继承体系图) 集合框架(Collection集合的基本功能测试) 集合框架(集合的遍历之集合转数组遍历) 集合框架(Collection集合 ...

  6. 更改嵌入式Linux中开机画面----左上角小企鹅图标

    一直想给嵌入式仪表加个开机LOGO,但是没有找到更换的方法.最近在网上收集了一些文章,整理一下一共自己参考.目前也还没有试过这种方法究竟是否可以.但察看Kernel源代码可以知道,Linux-2.6的 ...

  7. Oracle12c Release1安装图解(详解)

    工具/原料   Windows系统平台 Oracle12cR1数据库软件 方法/步骤   1 我的机器基础环境:Windows8(x64) + Oracle11g Release2(x64): 初次全 ...

  8. AndroidWear开发之下载SDK[Android W/Android L]

    Android L Developer Preview SDK发布了,但是天朝还是无法更新到.打开SDK Manager依旧一成不变,这时候就需要利器了. 第一步: 打开Goagent,不要说不知道什 ...

  9. LeetCode——Search Insert Position

    Description: Given a sorted array and a target value, return the index if the target is found. If no ...

  10. Cisco IOS和IOS XE 新漏洞检测与修复

    Cisco IOS/IOS XE 新漏洞检测与修复 CVE-2018-0150 Cisco IOS XE 存在默认弱口令 漏洞影响: 默认弱口令可以导致攻击者直远程登录控制Cisco设备.受影响版本, ...