在SQL Server中对表进行分区管理时,一定涉及到文件与文件组,关于文件与文件组如何建立在网上资料不少,我博客里也有两篇相关转载文件,能够看看,我这就再也不细述,这里主要讲几个通常网上不多讲到的东西,但有时候却很重要。数据库
前面内容主要摘自SQL的联机帮助:性能
一、一个文件或文件组不能由多个数据库使用。例如,任何其余数据库都不能使用包含 sales 数据库中的数据和对象的文件 sales.mdf 和 sales.ndf。日志
二、一个文件只能是一个文件组的成员。code
三、一个文件组能够包含多个文件,一个数据表在建立时能够指定要将数据放在那一个文件组上,而没有办法指定是要放在哪个文件上,文件组对组内的全部文件都使用按比例填充策略。对象
四、事务日志文件不能属于任何文件组。blog
使用文件和文件组时的一些通常建议:索引
大多数数据库在只有单个数据文件和单个事务日志文件的状况下性能良好。事务
若是使用多个文件,请为附加文件建立第二个文件组,并将其设置为默认文件组。这样,主文件将只包含系统表和对象。博客
若要使性能最大化,请在尽量多的不一样的可用本地物理磁盘上建立文件或文件组。将争夺空间最激烈的对象置于不一样的文件组中。class
使用文件组将对象放置在特定的物理磁盘上。
将在同一联接查询中使用的不一样表置于不一样的文件组中。因为采用并行磁盘 I/O 对联接数据进行搜索,因此性能将得以改善。
将最常访问的表和属于这些表的非汇集索引置于不一样的文件组中。若是文件位于不一样的物理磁盘上,因为采用并行 I/O,因此性能将得以改善。
请勿将事务日志文件置于其中已有其余文件和文件组的物理磁盘上。
文件组对组内的全部文件都使用按比例填充策略的解析:
当数据写入文件组时,SQL Server 数据库引擎按文件中的可用空间比例将数据写入文件组中的每一个文件,而不是将全部数据都写入第一个文件直至其变满为止。而后再写入下一个文件。例如,若是文件 f1 有 100 MB 可用空间,文件 f2 有 200 MB 可用空间,则从文件 f1 中分配一个区,从文件 f2 中分配两个区,依此类推。这样,两个文件几乎同时填满,而且可得到简单的条带化。
假定将数据库设置为自动增加,则当文件组中的全部文件填满后,数据库引擎便会采用循环方式一次自动扩展一个文件以容纳更多数据。例如,某个文件组由三个文件组成,它们都设置为自动增加。当文件组中全部文件的空间都已用完时,只扩展第一个文件。当第一个文件已满,没法再向文件组中写入更多数据时,将扩展第二个文件。当第二个文件已满,没法再向文件组中写入更多数据时,将扩展第三个文件。当第三个文件已满,没法再向文件组中写入更多数据时,将再次扩展第一个文件,依此类推
本身实践过程摸索的内容:
文件与文件组的删除,若是由于之前的分区方案不合理,须要取消分区,或者按另一种方式分区,就须要涉及到文件与文件组的删除操做,若是没有掌握正确步骤,有时候可能没法删除,会提示你“文件不为空,没法删除”或者“文件组不为空,不能删除”等等,若是不知道技巧,会很郁闷!本人就曾经经历过这样的郁闷!在百度也没找到正确答案,下面说说我本身通过摸索后获得的答案。
一、 文件的删除:首先要先清空文件里的数据,删除以前数据必定要记得先备份,可将数据复制到其余表,而后执行:
DBCC SHRINKFILE (FileName, EMPTYFILE);
文件中的内容删除后,再执行删除文件命令,DataBaseName表示数据名,FileName 表示文件名:
ALTER DATABASE [DataBaseName] REMOVE FILE FileName;
二、文件组的删除:
当文件组的文件被删除后,按正常理解,应该就能够直接删除文件组,实际是不行的,你没法删除文件组。
由于还有几个东西依赖文件组,一是分区方案,二是使用该分区方案的分区表。
因此要删除分区方案才能删除文件组。但要删除分区方案以前要先更改依赖它的分区表,使其不依赖它。
这个主要是更改分区表的分区列,使其不使用分区方案,若是实在不会更改,在表里数据已经备份的前提下,能够直接删除表来解决。
而后再删除分区表方案,最后就能够直接删除文件组了。
总结前面的删除过程:
一、修改分区表,使其不依赖分区方案。
二、删除分区方案(依赖要删除的文件组)。
DROP PARTITION SCHEME [Part_func_scheme_Name]
三、直接删除文件组。
ALTER DATABASE [DataBaseName] REMOVE FILEGROUP [FGName]
DataBaseName表示数据名,FGName 表示文件组名。