2

我有一些定期交付新数据的报告活动,我目前的策略是删除旧数据然后插入新数据,我使用范围查询在一段时间内批量移动报告数据。

我的插入性能应该很好,因为我在这里所做的只是追加一个不断增加的数字,我使用的是datetime2(7)数据类型并sysdatetime()作为默认值。

但是,我担心碎片问题。

旧数据将首先被写入,但最终数据将被删除,新数据(替换此数据)将被附加到末尾。

我的数据在更新时应该有效地滚动到未来。

我完全排除所有旧数据最终被删除。

我仍然需要担心碎片化还是会这样做?我怀疑这会有很好的性能,但我仍然有点担心 SQL Server 将无法回收已删除的空间。

4

1 回答 1

1

我了解您将按聚集索引顺序插入和删除。这个设计非常合理。一段时间后,您可能仍会在插入时出现碎片,因为插入将重用已删除的页面。很可能存在异常,例如未释放单个页面或用于插入的范围内存在其他杂项页面。从这个意义上说,碎片化会导致更多的碎片化作为一个随机过程。

保证没有碎片的唯一方法是粗略地对数据进行分区并将每个分区放入一个新的文件组中。这确保了插入总是在文件的末尾(没有其他地方可以放置它们)。此外,删除最终会导致整个分区变得符合删除条件。

你有非聚集索引吗?他们也可能会变得支离破碎。

于 2012-08-25T11:18:58.410 回答