0

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

delete语句大约需要 15 分钟,但我们不能使用 a truncate,因为我们必须加载整个 12 年,这将花费更长的时间。

问题:

invoice_dat像这样拆分大桌子是不是一个好设计

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

这样一来,我们可以使用truncateoninvoice_data_new而不需要使用delete语句?

有没有更好的方法?

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

4

3 回答 3

1

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

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

分区的交换非常快。显然 SQL Server 有一些非常相似的东西 - 请参阅SQL Server 中分区交换的 SO 问题

于 2012-08-22T10:07:00.010 回答
1

我认为解决这个问题的最佳方法是“水平分区”。基本上,您创建了一个数据滑动窗口——随着新时期的数据在最后添加,旧数据在开始时被删除。

在 4 年的过程中,您可能有 48 个分区(每月一个)。

这种方法的最大优点是 SQL Server 知道数据是以这种方式分区的,并且可以自动优化查询以仅使用具有相关数据的分区 - 即当您select从上个月获取数据时,SQL Server 将只知道搜索一个分区,或 1/48 的数据。

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

这种方法的缺点是在设置和维护方面确实需要更多的努力(除非您编写一些自动化的月末脚本,这可能是一个不平凡的练习)

于 2012-08-22T10:11:49.530 回答
0
  • 按天对表进行分区
  • 删除过去两年的分区
  • 导入新数据
于 2012-08-22T10:12:01.293 回答