我有一个经典的“销售”数据库,在某些表中包含数百万行。在这些大表中的每一个上,我都有一个关联的“删除”触发器和“备份”表。
此备份表保留过去 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())
备份表的结构类似于原始数据表(键,值)。唯一的区别是我在备份表中添加了一个“已修改”字段,我将其集成到 key 中。
我的一位同事告诉我应该使用“循环”,因为一旦备份表包含数百万行,我的删除语句就会导致超时/问题。该删除实际上会在某个时候爆炸吗?我应该以不同的方式做某事吗?
最佳答案
貌似Sybase 12.5支持表分区;如果您的设计是数据可以保留恰好 7 天(使用硬断点),您可以在一年中的某一天对表进行分区,并构建一个 View 来表示当前数据。当时钟在某一天过去时,您可以显式截断旧分区。
只是一个想法。
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/
关于sql - 非常大的 "delete from"语句与 "where"关闭,我应该优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11243643/