用于归档数据的表分区

Die*_*ego 13 sql-server-2005 sql-server partitioning

设想:

  • 两个数据库:DB_A 和 DB_Archive,有一个非常大的表叫做 tableA。
  • 每天,超过 60 天的记录从 DB_A 中删除并移动到 DB_Archive 主要是为了让事物“分离”,因为 tableA 在 DB_A 上被大量查询过去 2 个月的记录。

我想摆脱这个过程,因为它很慢并且消耗大量资源。我正在考虑使用日期列上的分区函数在 DB_A 上实现表分区,并在一个分区上存储 < 2 个月的所有记录,在另一个分区上存储 > 2 个月的所有记录。我的问题:

  • 如果我有 2 个不同的数据库,这种情况是否会表现得像?如果我查询 tableA 中的记录 > getdate() - 30,它会读取归档分区吗?
  • 我想我也必须对索引进行分区,对吗?
  • 我如何处理明天我的分区函数将“更改”的事实,我的意思是,如果我今天创建该函数(7 月 2 日,其范围将是 5 月 2 日,但明天将是 5 月 3 日)。我可以创建动态分区函数吗?

Rem*_*anu 6

通过分区,您必须每天进行一个分区,这将 Pre-SQL 2012 的 1000 个分区限制置于新的角度,因为它只允许 3 年存档。使用 SQL Server 2012,您可以获得 15000 个分区,这对于每天 1 个分区来说已经足够了。

每天您都会添加一个新分区。如果您想移动过去第 61 天的分区,您可以高效地进行,但仍然是离线操作。请参阅有效地将分区移动到不同的文件组

您的所有索引都必须对齐,请参阅分区索引的特殊指南

购买分区并不是一个容易的决定,它可能需要大量咀嚼......请参阅如何决定是否应该使用表分区。具体来说,您不应期望分区会提高性能。您应该通过按日期时间聚类来解决时间序列的性能问题。


JNK*_*JNK 2

我不知道配分函数是否可以是动态的,但我对此表示怀疑。一些不走那条路的选择:

1 - 按日历 DATE 进行分区并每天移出最旧的分区

2 - 创建一个按日期过滤的视图,并将所有现有查询指向那里(这可以通过将基础表重命名为其他内容并将视图命名为当前表的名称来轻松管理)。这也可以通过索引更改来优化。

请记住,如果您在查询中使用日期字段,上面的第一个选项会效果更好。如果不这样做,它仍然会比当前过程更快,但查询不会有巨大的改进。如果您可以过滤分区字段并且优化器知道要查看哪个分区,那么分区通常效果最好。