在单个文件组上分区

10 sql-server filegroups partitioning

我的数据库中有一些非常大的表,但是这些数据中有很大一部分是“旧的”。

由于我无法控制的情况,我不允许删除这些“旧”数据。另一个限制是我无法修改数据库,这意味着向其中添加文件组。现在的情况是,一切都驻留在PRIMARY文件组中。

我想将这些表分成几个分区,例如“新”、“旧”、“存档”等。我确实有一个“状态”列,我想用于此目的。

鉴于所描述的场景和限制,我想知道分区在这里是否有意义。换句话说,如果我的表以这种方式分区,但所有分区都位于同一个文件组中,SQL Server 是否足够聪明,可以在底层文件中找到我的“新”数据所在的特殊区域,而不触及具有“旧”数据的区域?

换句话说,假设我 80% 的数据是“旧的”。SQL Server 是否有一种机制可以避免访问 100% 的底层文件,而只访问 20% 包含“新”数据的内容(当然,假设我WHERE在查询子句中指定了我的分区列)。

我想要回答这个问题,需要了解分区是如何在内部实现的。我很感激任何指点。

Mik*_*Fal 6

在同一个文件组中对表进行分区有两个优点:

  1. 允许以增量方式重建大型索引的部分,从而实现更有效的维护。查看ALTER INDEX [foo] REBUILD PARTITION=n更多详细信息。
  2. 利用分区消除和(可能)分区级锁定来改进查询维护。我在我的博客上讨论过这个问题。

如果要进行分区,有几件事要记住。

  • 如果你的表有一个聚集索引(它确实应该),你的分区键必须是聚集索引的一部分。
  • 为避免性能问题,您应该对齐分区。这意味着您的所有索引都应该包括您的分区键,无论是作为包含还是作为索引本身的一部分。
  • 在当前版本的 SQL Server (2005-2012) 中,分区的索引重建处于脱机状态。如果您的分区很大并且您按分区重建,这可能会导致阻塞问题。

我建议在实施分区之前对分区进行一些彻底的研究。Kendra Little 有一个很好的资源列表,您可以从中开始。


Gor*_*off 0

答案是“是”。它确实对任何查询都有一种机制,可以根据用于定义分区的逻辑来过滤输入。

不过,您必须有适当的过滤器,否则所有分区都会被扫描。这通常涉及使用日期过滤器(在您的情况下)来选择分区。

实现这一点的一种方法是让视图仅访问一个分区,并在视图中使用正确的逻辑。