1

我有一个经典的“销售”数据库,其中包含某些表中的数百万行。在这些大表中的每一个上,我都有一个关联的“删除”触发器和“备份”表。

此备份表在过去 7 天内保留“已删除”行:触发器首先将已删除的行复制到该备份表中,然后将以这种方式在备份中执行删除:

CREATE TRIGGER dbo.TRIGGER
ON dbo.EXAMPLE_DATA
FOR DELETE AS
INSERT INTO EXAMPLE_BACKUP
select getDate(), *
from deleted
DELETE from EXAMPLE_BACKUP
where modified < dateadd(dd, -7, getDate())

备份表的结构类似于原始数据表(键、值)。唯一的区别是我在备份表中添加了一个“已修改”字段,我将其集成到密钥中。

我的一位同事告诉我应该使用“循环”,因为一旦备份表包含数百万行,我的删除语句就会导致超时/问题。该删除实际上会在某个时候爆炸吗?我应该以不同的方式做某事吗?

4

1 回答 1

3

看起来 Sybase 12.5 支持表分区;如果您的设计使得数据可以保留 7 天(使用硬断点),您可以在一年中的某一天对表进行分区,并构建一个视图来表示当前数据。随着时钟在某一天滴答作响,您可以显式地截断较旧的分区。

只是一个想法。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20020_1251/html/databases/X15880.htm

否则,循环删除是一种合理的方法,可以在不破坏事务日志的情况下删除大量数据。这是使用 SQL Server 的一种方法:

http://sqlserverperformance.wordpress.com/2011/08/13/gradually-deleting-data-in-sql-server/

于 2012-06-28T11:49:43.420 回答