拆分表以优化删除持续时间

时间:2012-08-22 09:58:32

标签: sql

考虑一个表invoice_data,其中包含有关12年以上发票的数据。这些数据每天都会被加载到一个多维数据集中。每次加载时,最新的2年都会从invoice_data中删除,过去2年的数据会再次被实时系统导入。 (我们这样做,因为值也可能在旧数据集中发生变化)

delete语句大约需要15分钟,但我们无法使用truncate,因为我们必须加载整整12年,这需要更长的时间。

问题:

分割像这样的大表invoice_dat是一个好的设计

  • invoice_data_old,其中包含years < actual year - 2
  • invoice_data_new,其中包含years >= actual year -2

这样,我们可以在truncate上使用invoice_data_new,而无需使用delete语句吗?

有没有更好的方法?

我正在使用SQL SERVER 2008,但我认为这是一个普遍的问题。

3 个答案:

答案 0 :(得分:1)

在Oracle中,您将使用分区表(按年份分区)。那么你可以

  • 将数据加载到两个新表中
  • 使用分区交换将现有分区与新数据交换
  • 删除旧数据

分区的交换速度非常快。 显然,SQL Server有一些非常相似的东西 - 请参阅SO question on Partition Exchange in SQL Server

答案 1 :(得分:1)

我认为解决这个问题的最佳方法是“横向分离”。基本上,您创建了一个数据滑动窗口 - 在最后添加新的数据周期时,旧数据将在开始时删除。

在4年的时间里,您可能有48个分区(每月一个)。

这种方法的一大优势是SQL服务器意识到数据是以这种方式分配的,并且可以自动优化查询以仅使用具有相关数据的分区 - 即当您select数据来自最后一个时一个月,SQL Server将知道只搜索一个分区,或1/48的数据。

另一个重要方面是删除最旧的分区变为元数据操作,因此不会锁定任何内容。

这种方法的缺点是在设置和维护方面需要付出更多努力(除非你编写一些自动月末脚本,这可能是一项非常重要的练习)

答案 2 :(得分:0)

  • 白天对您的表格进行分区
  • 从过去两年开始删除分区
  • 导入新数据