为了提高 SQL Server 的性能,我想使用简单的 1 文件(1 mdf 和 1 ldf)数据库,并将 mdf 文件(可能还有 ldf 文件)拆分到多个磁盘驱动器上。我认为最有效的方法是将大表分区到这些多个 mdf 文件中。(我打算只使用分区函数,它是主键(int 或 bigint)的模数,例如 (MyTable.Id % 8),其中 8 是我拥有的磁盘数量)。
最快/最佳/正确的方法是什么?例如,我需要执行哪些 SQL 命令或 SSMS 操作才能从我现在的位置到达我想要去的地方。
任何其他建议也将不胜感激。(通过存储空间组合驱动器似乎不是一个选择,因为出于某种原因,当我这样做时,我并没有获得良好的写入 IOPS 性能。)
答案1
您不必进行分区(但如果有其他原因,也可以)。如果您创建一个包含所需物理文件的新文件组并在新文件组上重建索引,那么这应该足以将数据分布在这些物理文件中。
重建过程将如下所示。假设当前索引具有以下定义:
create clustered index [CIX_foo] on dbo.foo (FooID) on [PRIMARY];
你可以像这样重建它:
create clustered index [CIX_foo] on dbo.foo (FooID) with (drop_existing = on) on [NewFileGroup];
使用创建该索引时通常使用的任何其他选项(即 sort_in_tempdb、pad_index、online、resumable 等)。还要考虑更改现有索引的压缩设置是否有意义 - 您正在重写整个索引,所以现在是时候了!
最后,作为建议,我会在新的文件组中为每个驱动器创建至少两个文件。为什么?如果您的 8 个文件(以及大概 8 个驱动器)的 SWAG 不足以满足您的使用情况,您将不得不再次执行上述索引重建过程。但是如果您这样做了,比如说每个驱动器两个文件(总共十六个),您可以配置新的存储,并且只需执行文件系统文件复制(当数据库处于脱机状态时)或指定新位置的恢复。这两种方法都应该比重建索引更快。