SQL Server 数据库文件碎片

Jos*_*ond 6 sql-server-2008

我继承了一个系统,其中以前的 DBA 将 7 个数据文件添加到 PRIMARY 文件组(8MB 初始大小)并将 AUTOGROW 选项保留为 8MB。我现在拥有的是一组八个文件,每个文件的大小约为 3-4GB,这些文件在两年内一直在缓慢增长。我想以最快的方式删除文件碎片。

以下是我想出的选项:

  1. 将主文件组中的第一个文件扩展 ~28GB(7 个文件 x 4GB)
  2. 将数据从每个连续文件中移出并将它们标记为删除
  3. 删除其他 7 个文件
  4. 分离数据库
  5. 将分离的数据库文件复制到服务器上的不同驱动器
  6. 将分离的数据库文件复制回原始驱动器
  7. 重新连接数据库

或者

  1. 创建一个大小为 32GB (8 x 4GB) 的新数据库
  2. 使用 SSIS 将所有对象、表、用户和权限转移到新数据库
  3. 删除旧数据库
  4. 重命名新数据库

操作系统级别的“磁盘碎片整理”仍然不是一个选项吗?

我不知道哪个选项是最好的,或者它是否有效。

此外,该数据库正在被镜像和复制,因此在重建它方面的工作量最少。

谢谢你的帮助。

Mar*_*ian 3

现在,在空间增加如此之多之后,物理文件肯定会碎片化,并且会受益于文件级别的一些碎片整理。

我不知道你的情况,但任何服务器都应该足够快来提供单个 32 GB 数据文件。只有当所有这些文件都位于不同的物理磁盘上时,我才会看到好处,否则我认为不需要这样的麻烦。

在这种情况下,我会选择解决方案 1,不过,我会创建比当前大小更大的文件,其空间至少足以满足明年的需求,并且具有更大的大小以供自动增长。

我不认为操作系统级别的碎片整理可用于实时数据库文件。我一直认为您需要将其分离才能对文件进行碎片整理,但似乎来自 Serverfault 答案的人能够在数据库在线时对数据库文件进行碎片整理。

您的两个选项都应该能够工作,通过使用单个碎片整理文件使您的数据库更快,但是,对于解决方案 2,我认为不需要具有相同数量的文件,您可以使用单个文件创建一个数据库数据文件并使用 SSIS/bcp 移动新数据库表中的所有内容。

我之前会测试,但我认为第一个解决方案会更快。