sql-server - 归档大量旧数据会锁定我的数据库吗?

标签 sql-server stored-procedures triggers sql-agent-job

我需要将一个月前的数据日志记录表移动到日志记录归档表,并且删除一年以上的数据

数据很多(2个月插入600k)。

我正在考虑每天/每周简单地调用(批量)存储过程。

我首先想到做 2 个存储过程:

  1. 存档中删除超过 365 天的内容
  2. 将超过 30 天的数据从日志记录移动到存档(我想有一种方法可以通过 1 个 SQL 查询来做到这一点>)
  3. 日志记录中删除超过 30 天的内容。

但是,这个解决方案似乎效率很低,并且可能会锁定数据库几分钟,这是我不希望的。

那么,我还有其他选择吗?它们是什么?

最佳答案

这些都不应该锁定您实际使用的表。您当前仅写入logging 表,并且仅写入新记录。

您从logging表中仅选择旧记录,并写入除存档过程之外不写入的表。

您正在采取的步骤听起来不错。我会更进一步,而不是根据日期删除,只需在 id 字段上对存档表执行 INNER JOIN - 然后您只删除特定记录您已存档。

顺便说一句,600k 条记录根本不是很大。我们拥有包含超过 20 亿行的表的生产数据库,而且我知道这里的其他一些人拥有每分钟向事务表插入数百万次的数据库。

编辑:

我最初忘记包括,您计划的方法的另一个好处是每个步骤都是独立的。如果您因任何原因需要停止,您的任何步骤都不会具有破坏性,也不依赖于立即执行的下一步。您可能会归档大量记录,然后在第二天或隔夜运行删除操作,而不会产生任何问题。

关于sql-server - 归档大量旧数据会锁定我的数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6753972/

相关文章:

sql - 与SQL Server项目或项目中本地mdf文件持续集成的最佳实践

postgresql - SELECT FROM 返回具有任意列数的记录的函数

mysql - mysql存储过程语法

postgresql - 错误 : record "old" is not assigned yet

sql - 在 BEFORE INSERT 触发器中使用 IF EXISTS (SELECT ...) (Oracle)

sql - 查询30000条SQL记录的方法

sql-server - SQL Server CDC : Track additional column after the fact

sql-server - 编写 CLR 存储过程

MySQL触发器不起作用

sql-server - 为什么 MS SQL Mgmt Studio Express 总是忘记我的密码?