使用分区表删除数百万条记录?
delete millions records using partition tables?
我们每天将大约 100 万条记录写入 sql 服务器 table。
Records 有一个 insertdate 和 status 字段,当然还有其他字段。
我需要不时删除记录以释放卷上的 space,但将最近 4 天的记录留在那里。
问题是删除需要数小时和大量资源。
我考虑过分区 tables 在 insertdate 上设置分区字段,但我从未使用过那种 tables。
我怎样才能使用更少的 cpu/disk 资源实现目标并使解决方案的缺点尽可能少? (我假设任何解决方案都有其自身的缺点,但如果您知道请解释它们)。
您可以采用两种方法来加快删除速度。一种是一次删除 10000 行,这样事务日志就不会增长到巨大的大小。根据某些逻辑,您会不断删除前 10000 行,直到所有满足条件的行都被删除。根据您的系统,这可以将删除速度提高 100 倍。
另一种方法是在 table 上创建一个分区。您必须创建一个分区模式和函数,如果您要删除的所有行都在一个分区中,假设一天的销售额,那么删除分区将删除元操作中的所有行,并且只需要几个秒做。分区并不难,但您必须花一些时间来正确设置滚动 window。一个多小时不到一个星期。
我们每天将大约 100 万条记录写入 sql 服务器 table。 Records 有一个 insertdate 和 status 字段,当然还有其他字段。 我需要不时删除记录以释放卷上的 space,但将最近 4 天的记录留在那里。 问题是删除需要数小时和大量资源。
我考虑过分区 tables 在 insertdate 上设置分区字段,但我从未使用过那种 tables。
我怎样才能使用更少的 cpu/disk 资源实现目标并使解决方案的缺点尽可能少? (我假设任何解决方案都有其自身的缺点,但如果您知道请解释它们)。
您可以采用两种方法来加快删除速度。一种是一次删除 10000 行,这样事务日志就不会增长到巨大的大小。根据某些逻辑,您会不断删除前 10000 行,直到所有满足条件的行都被删除。根据您的系统,这可以将删除速度提高 100 倍。
另一种方法是在 table 上创建一个分区。您必须创建一个分区模式和函数,如果您要删除的所有行都在一个分区中,假设一天的销售额,那么删除分区将删除元操作中的所有行,并且只需要几个秒做。分区并不难,但您必须花一些时间来正确设置滚动 window。一个多小时不到一个星期。