【问题标题】:Efficient way to delete records every 10 mins每 10 分钟删除一次记录的有效方法
【发布时间】:2011-07-07 10:17:56
【问题描述】:

手头的问题

需要每 10 分钟从 SQL Server 数据库表中删除几千条记录。这是清理旧记录的一部分。

正在考虑的解决方案

  1. .Net 服务正在运行以实现其他一些功能。相同的服务可以与计时器一起使用,在 db 上执行 SQL 删除命令。
  2. SQL 服务器作业
  3. 触发器

提供解决方案的主要考虑因素

  1. Ours 是部署在不同客户位置的网络产品。我们希望将运营开销降到最低,因为部署资源的技术技能非常有限,而且我们还希望确保我们的产品几乎没有配置要求。
  2. 性能非常重要,因为它在实时事务数据库上。

【问题讨论】:

  • 记得接受正确的答案作为答案...

标签: sql-server sql-server-2008 scheduled-tasks


【解决方案1】:

删除的效率来自于索引,与定时器如何触发无关。通过范围扫描可以轻松识别“旧”记录是非常重要的。如果 DELETE 必须扫描整个表以查找这些“旧”记录,它将阻止所有其他活动。通常在这种情况下,表首先按日期时间值聚集,如果需要,唯一的主键会委托给非聚集索引。

现在如何弹出计时器,你真的有三种选择:

SQL 代理作业是 10 分钟间隔的最佳选择。唯一的缺点是它不适用于 SQL Express 部署。如果这是一个问题,那么对话计时器和activated procedures 是一个可行的选择。

最后一个选项的缺点是应用程序必须正在运行,计时器才能触发删除。如果这不是一个问题(即,如果应用程序没有运行,那么记录没有被删除并不重要)那么就可以了。请注意,对于此类计时器,ASP.Net 应用程序非常糟糕,因为 IIS 和 ASP 可能会选择回收和休眠应用程序池。

【讨论】:

  • 正如我上面回答的那样,我可能会坚持 SQL 工作,因为这里似乎是同意。
【解决方案2】:

我不会使用触发器...并坚持使用 SQL Server DTS 或 SSIS。显然,您将需要某种标识符,因此我将使用带有索引的时间戳列...如果不需要,只需每晚触发一次 TRUNCATE。

【讨论】:

    【解决方案3】:

    这听起来正是 SQL Server 作业旨在提供的那种工作;数据库维护。

    计划作业可以执行一个基本的 T-SQL 语句,该语句将删除您不再需要的记录,无论您希望它在什么计划上运行。可以将作业创建脚本编写为标准部署脚本的一部分,这应该可以抵消部署成本。

    此外,通过利用 SQL Server 的成熟部分,您可以利用了解 SQL 作业并能够管理它们的其他数据库管理员的知识。

    【讨论】:

    • 即使我更倾向于 SQL 作业,只关心一个问题 - 实时环境中的操作/管理。如果 Job 因某种原因停止或失败怎么办,我们会知道的。我所指的 .net 服务已经内置了日志记录和警报,因此我们可以使用它。无论如何,我仍然认为它是纯粹的 db 工作,db 应该这样做。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-08-31
    相关资源
    最近更新 更多