关于SQL Server中分区表的文件与文件组的删除(转)

在SQL Server中对表进行分区管理时,必定涉及到文件与文件组,关于文件与文件组如何创建在网上资料很多,我博客里也有两篇相关转载文件,可以看看,我这就不再细述,这里主要讲几个一般网上很少讲到的东西,但有时候却很重要。

前面内容主要摘自SQL的联机帮助:

  1、一个文件或文件组不能由多个数据库使用。例如,任何其他数据库都不能使用包含 sales 数据库中的数据和对象的文件 sales.mdf 和 sales.ndf

  2、一个文件只能是一个文件组的成员。

  3、一个文件组可以包含多个文件,一个数据表在创建时可以指定要将数据放在那一个文件组上,而没有办法指定是要放在哪一个文件上,文件组对组内的所有文件都使用按比例填充策略。

  4、事务日志文件不能属于任何文件组。

使用文件和文件组时的一些一般建议:

  • 大多数数据库在只有单个数据文件和单个事务日志文件的情况下性能良好。

  • 如果使用多个文件,请为附加文件创建第二个文件组,并将其设置为默认文件组。这样,主文件将只包含系统表和对象。

  • 若要使性能最大化,请在尽可能多的不同的可用本地物理磁盘上创建文件或文件组。将争夺空间最激烈的对象置于不同的文件组中。

  • 使用文件组将对象放置在特定的物理磁盘上。

  • 将在同一联接查询中使用的不同表置于不同的文件组中。由于采用并行磁盘 I/O 对联接数据进行搜索,所以性能将得以改善。

  • 将最常访问的表和属于这些表的非聚集索引置于不同的文件组中。如果文件位于不同的物理磁盘上,由于采用并行 I/O,所以性能将得以改善。

  • 请勿将事务日志文件置于其中已有其他文件和文件组的物理磁盘上。

文件组对组内的所有文件都使用按比例填充策略的解析:

当数据写入文件组时,SQL Server 数据库引擎按文件中的可用空间比例将数据写入文件组中的每个文件,而不是将所有数据都写入第一个文件直至其变满为止。然后再写入下一个文件。例如,如果文件 f1 有 100 MB 可用空间,文件 f2 有 200 MB 可用空间,则从文件 f1 中分配一个区,从文件 f2 中分配两个区,依此类推。这样,两个文件几乎同时填满,并且可获得简单的条带化。

假定将数据库设置为自动增长,则当文件组中的所有文件填满后,数据库引擎便会采用循环方式一次自动扩展一个文件以容纳更多数据。例如,某个文件组由三个文件组成,它们都设置为自动增长。当文件组中所有文件的空间都已用完时,只扩展第一个文件。当第一个文件已满,无法再向文件组中写入更多数据时,将扩展第二个文件。当第二个文件已满,无法再向文件组中写入更多数据时,将扩展第三个文件。当第三个文件已满,无法再向文件组中写入更多数据时,将再次扩展第一个文件,依此类推

自己实践过程摸索的内容:

  文件与文件组的删除,如果因为以前的分区方案不合理,需要取消分区,或者按另外一种方式分区,就需要涉及到文件与文件组的删除操作,如果没有掌握正确步骤,有时候可能无法删除,会提示你“文件不为空,无法删除”或者“文件组不为空,不能删除”等等,如果不知道技巧,会很郁闷!本人就曾经经历过这样的郁闷!在百度也没找到正确答案,下面说说我自己经过摸索后得到的答案。

    1、 文件的删除:首先要先清空文件里的数据,删除之前数据一定要记得先备份,可将数据复制到其他表,然后执行: 

DBCC SHRINKFILE (FileName, EMPTYFILE);

  文件中的内容删除后,再执行删除文件命令,DataBaseName表示数据名,FileName 表示文件名:

ALTER DATABASE [DataBaseName] REMOVE FILE FileName;

   2、文件组的删除:

      当文件组的文件被删除后,按正常理解,应该就可以直接删除文件组,实际是不行的,你无法删除文件组。

      因为还有几个东西依赖文件组,一是分区方案,二是使用该分区方案的分区表。

      所以要删除分区方案才能删除文件组。但要删除分区方案之前要先更改依赖它的分区表,使其不依赖它。

      这个主要是更改分区表的分区列,使其不使用分区方案,如果实在不会更改,在表里数据已经备份的前提下,可以直接删除表来解决。

  然后再删除分区表方案,最后就可以直接删除文件组了。

    总结前面的删除过程:

   1、修改分区表,使其不依赖分区方案。

 2、删除分区方案(依赖要删除的文件组)。

DROP PARTITION SCHEME [Part_func_scheme_Name]

 3、直接删除文件组。

ALTER DATABASE [DataBaseName] REMOVE FILEGROUP [FGName]

DataBaseName表示数据名,FGName 表示文件组名。

posted @ 2015-11-13 22:18  wbzhao  阅读(3938)  评论(0编辑  收藏  举报