我们的数据库目前只有一个 FileGroup,PRIMARY,它包含大约 8GB 的数据(表行、索引、全文目录)。
什么时候适合将其拆分为次级数据文件?我应该注意哪些标准?
答案1
这个问题有两个部分:何时添加新的 FILEGROUP,何时在文件组中添加新的 FILE。首先让我们谈谈理论:
马克说得对,主要原因是性能。
第二个原因是灾难恢复。使用 SQL Server 2005 及更新版本,您可以执行文件组恢复。当灾难发生时,您可以先恢复主文件组,然后将数据库部分联机以供查询。用户可以在您恢复其他文件组时运行查询。这对于具有大量历史数据(可能不需要立即使用)的数据库或需要将数据加载到当前表中而无需访问历史数据的数据仓库非常有用。
另一个原因是数据组的读/写配置文件。如果您有一些数据需要不断写入,而其他数据需要大量读取,则可以构建不同类型的存储来满足这些需求。您可以将大量写入的数据放在 raid 10 上,将读取偏向的数据放在更便宜的 raid 5 上。
现在,让我们来谈谈文件与文件组。当您在 SQL Server 中放置对象时,您必须将它们放置在文件组级别。您可以将表或索引放在文件组中,但不能选择特定的文件。所以到目前为止,我们讨论的所有内容都是关于何时添加文件组 - 但是何时添加文件呢?
如果您正在设计存储,并且拥有 80 个硬盘,那么您可以通过以下几种方式将其拆分:
- 一个包含 80 个驱动器的池
- 两个包含 40 个驱动器的池
- 四个包含 20 个驱动器的池等等...
不同的存储子系统具有不同的性能配置文件。我曾使用过一些 SAN,它们在 12-16 个驱动器阵列时性能最佳,而任何大于这个数量的驱动器阵列都没有性能改进。另一个示例是具有多路径的 SAN:如果您有多个 HBA 将服务器连接到存储,并且您的多路径软件不是真正的主动/主动,那么您可能需要每个路径一个阵列来分配负载。四条路径、四个驱动器池将在这些类型的驱动器上获得更好的性能。
在这些情况下,您最终会得到四个不同的阵列、四个不同的 Windows 驱动器(除非您使用挂载点,即使使用挂载点,它们也是不同的文件夹),并且您将需要 SQL Server 中的四个独立文件。这些独立文件可以位于同一个文件组中。
答案2
主要原因是性能。当主文件组磁盘驱动器上的 IOPS 容量用完时,您需要扩展到第二个文件组,以根据存储配置将 IOPS 分配到多个磁盘/LUN 上。
编辑:Brad Wilson 对 SSD 做出了很好的评论。如果您使用的是复合 SSD/SATA/FC 存储系统,您可能希望在不同类型的存储上拥有不同的文件组。然后,您可以将极端 IOPS 需求表放到 SSD 文件组中,而历史记录/统计表可以存储在便宜的 SATA 文件组中。
答案3
我还要指出的是,这个问题也涉及到可恢复性/数据可用性方面。通过使用多个文件组,而不是将任何用户定义的对象放在主文件组上,您可以更灵活地启用在线恢复。这允许在文件组级别进行逐个恢复。
2005 以后的 SQL Server 企业版和开发版均提供在线恢复功能
另一个想法是将只读静态参考数据与事务数据分开。对于较大的数据库,这可以减少执行备份所需的时间和/或空间。