我读过这个问题: 如何删除表分区
但这不是我想要的。
我想设置一个表,在日期/时间列上使用分区来进行 1 个月的分区。然后,配置一个执行 montlhy 的作业并删除记录超过 9 个月的分区。
我可以使用 SQL Server 2012 Enterprise 进行设置吗?
我读过这个问题: 如何删除表分区
但这不是我想要的。
我想设置一个表,在日期/时间列上使用分区来进行 1 个月的分区。然后,配置一个执行 montlhy 的作业并删除记录超过 9 个月的分区。
我可以使用 SQL Server 2012 Enterprise 进行设置吗?
目标是仅通过更新元数据来减少事务日志的数量。
当数据从分区中移动或删除时,它会插入和删除行,这将导致(吨)
LOB_INSERT_ROWS
和LOB_DELETE_ROW
事务日志。唯一的选择是截断分区,但此选项不存在。我们可以通过仅在空分区上使用
Merge
and来避免它。Split
在下面的示例中,我将缩短内容并仅创建过去 3 个月(即 8 月、9 月和 10 月)的数据,但您可以轻松地将其扩展到 9 个月。一旦数据开始添加到 11 月,8 月将被删除,以此类推,9 月和 12 月......
创建文件和文件组:
我首先创建 6 个文件和文件组 [Part_0] 到 [Part_5]:
创建函数和方案:
同样有 6 个分区。这将在稍后解释,但这主要是由于需要有空分区。
创建表和聚集索引:
因为我不知道您的桌子的确切设计,所以我将使用这张桌子:
这
Clustered Index
:虚拟数据:
从 10 月到 8 月(现在),此代码每 6 秒在一系列虚拟日期中创建超过一百万条记录:
分区数据:
这将分区如下:
添加十一月:
一旦在 11 月,新行将转到 [Part_4],并且可以从 [Part_1] 中删除 8 月的数据。在不必删除数十万行的情况下删除它的唯一方法是将 [Part_1] 从表中移开:
DataPart_Temp
必须与DataPart
(列、索引)相同DataPart
到,所以必须在同一个文件组上创建DataPart_temp
聚簇索引:[Part_1]DataPart_temp
DataPart
是切换到 的第一个也是唯一一个分区DataPart_temp
。现在所有 August 行都在DataPart_temp
.该表现在分区如下:
合并分区:
[Part_0] 和 [Part_1] 现在为空,可以合并:
[Part_1] 已被删除:
下个月添加:
现在 [Part_1] 不再使用,可以将其添加到分区方案中作为下一个可用分区:
然后 [Part_5] (December, >= '20151201') 可以拆分:
由于 [Part_5] 为空,因此无需移动任何内容。[Part_5] 的另一半将转到下一个可用分区,即 [Part_1]:
清理:
DataPart_temp
现在可以截断然后删除(或至少删除其聚集索引)。添加以下月份:
在 12 月,必须将分区 ID 2 移走 ([Part_2]),与分区 1 合并,然后在 1 月拆分之前添加回来。
为了自动执行此过程,您必须查找分区 2 的文件组名称:
然后创建动态 SQL 以:
如果您使用 fn_dblog,您应该会看到事务日志很少。