sql - 非常大的 "delete from"语句与 "where"关闭,我应该优化吗?

标签 sql database sybase

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

此备份表保留过去 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/

相关文章:

Mysql:计算特定日期差异匹配时的增加/减少百分比

sql - 如何在 SQL Server 中比较两列是否相等?

mysql - 数据库中是否需要将域名存储为md5模式?

database - Swift - 从数据库中删除单条记录

stored-procedures - 在 Sybase ASE 15.0 中处理从一个存储过程到另一个存储过程的错误

sql - Play框架忽略进化脚本

php - 如何按大多数 View 类别明智地对数据进行排序

php - 一张表多字段还是两表少字段?

sql - Sybase:如何以 mm/dd/yyyy 格式获取当前日期?

sybase - sybase 15 是否支持 java 中的 bcp api?