在单个文件组上分区


10

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

由于无法控制的情况,我不允许删除此“旧”数据。另一个限制是我无法修改数据库,这意味着要向其中添加文件组。按照目前的状态,所有内容都驻留在PRIMARY文件组中。

我正在考虑将这些表划分为几个分区,例如“新”,“旧”,“已归档”等。为此,我确实有一个“状态”列。

考虑到上述情况和限制,我想知道分区在这里是否有意义。换句话说,如果以这种方式对我的表进行分区,但是所有分区都位于同一文件组上,SQL Server将足够聪明地在我的“新”数据所驻留的基础文件中找到该特殊区域,并且不会碰到具有“旧”数据的区域?

换句话说,如果我的数据中有80%是“旧的”。SQL Server是否具有避免访问100%的基础文件并仅访问20%的包含“新”数据的机制(假设,当然,我WHERE在查询的子句中指定了分区列)。

我想回答这个问题,就需要了解如何在内部实现分区。我感谢任何指示。

Answers:


6

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

  1. 允许逐步重建大索引的各个部分,从而实现更有效的维护。查看以ALTER INDEX [foo] REBUILD PARTITION=n获得更多详细信息。
  2. 利用分区消除和(可能)分区级别锁定来改善查询维护。我在博客上讨论了这一点。

如果要分区,请牢记几件事。

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

我建议在实现分区之前对分区进行一些彻底的研究。肯德拉·利特尔(Kendra Little)提供了很好的资源清单,您可以从这里开始。


如果我已经对分区索引进行了分区,那么是否所有非分区索引都已包含分区列作为行定位符?
Zikato

0

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

但是,您必须具有适当的过滤器,否则将扫描所有分区。通常,这需要使用日期过滤器(在您的情况下)来选择分区。

强制执行此操作的一种方法是使视图仅访问一个分区,并且视图中具有正确的逻辑。


我想知道将其分区到同一物理磁盘会带来多少性能提升
。.– sotn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.