在SQL Server中,什么时候应该将PRIMARY数据文件组分成二级数据文件?

我们的数据库目前只有一个FileGroup,PRIMARY,它包含大约8GB的数据(表行,索引,全文目录)。

什么时候把它分成二级数据文件? 我应该知道哪些标准?

这个问题有两个部分:何时添加新的FILEGROUP,何时在文件组中添加新的FILE。 首先让我们谈论理论:

Mark对于performance的主要原因是正确的。

次要原因是灾难恢复。 使用SQL Server 2005及更新版本,您可以执行文件组恢复。 发生灾难时,您可以先恢复主文件组,然后将数据库部分联机以进行查询。 用户可以在恢复其他文件组的同时运行查询。 这对于有大量历史数据的数据库可能不需要马上需要,或者数据仓库需要将数据加载到当前表中而不需要历史数据来访问。

另一个原因是数据组的读/写configuration文件。 如果你有一些不断被写入的数据,而其他的数据会产生大量的读取活动,你可以构build不同types的存储来满足这些需求。 你可以把重写的东西放在突袭10上,而把阅读偏差的东西放在便宜的突袭5上。

现在,我们来讨论文件和文件组。 在SQL Server中放置对象时,必须将它们放在文件组级别。 你可以在一个文件组中login一个表或一个索引,但是你不能select一个特定的文件。 所以到目前为止,我们讨论的所有内容都是关于何时添加文件组 – 但是何时添加文件?

如果您正在devise存储设备,并且您有80个硬盘驱动器,则可以通过以下几种方式将其分解:

  • 一个80个驱动器池
  • 两个40驱动器池
  • 四个20驱动器池等

不同的存储子系统具有不同的性能概况。 我曾经和一些在12-16驱动器arrays上performance最好的SAN一起工作,而比这更大的任何一个都没有提高性能。 另一个例子是具有多path的SAN:如果您有多个HBA将您的服务器连接到您的存储,并且您的多path软件不是真正的主动/主动,那么您可能需要每个path一个arrays来分配负载。 四个path,四个驱动器池将在这些types的驱动器上获得更好的性能。

在这种情况下,最终会有四个不同的arrays,Windows下有四个不同的驱动器(除非您使用装入点,即使这样它们也是不同的文件夹),您将需要SQL Server中的四个单独的文件。 这些单独的文件可以在同一个文件组中。

主要原因是性能。 当您的主文件组磁盘驱动器上的IOPS容量用完时,您需要展开到第二个文件组,以根据存储configuration将IOPS分割到多个磁盘/ LUN上。

编辑:布拉德·威尔逊关于固态硬盘的好评。 如果您使用的是复合SSD / SATA / FC存储系统,则可能希望在不同types的存储上拥有不同的文件组。 然后,您可以将您的极限IOPS需求表放到SSD filegropus上,而历史/统计表可以存储在便宜的SATA文件组上。

我还要指出,这个问题还有一个可以恢复的数据可用性方面。 通过使用多个文件组,并且不在主文件组上放置任何用户定义的对象,您可以更灵活地启用联机还原。 这允许在文件组级别零碎还原。

在线还原在2005年后的SQL Server的Enterprise和Developer版本中可用

想到的另一个想法是从事务数据中分离只读静态引用数据。 对于较大的数据库,这可以减less执行备份所需的时间和/或空间。