考虑一个表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,但我认为这是一个普遍的问题。
答案 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)