【问题标题】:SQL Server - On-Insert Trigger vs. Per-Minute JobSQL Server - 插入触发器与每分钟作业
【发布时间】:2012-04-18 23:03:15
【问题描述】:

我的问题主要是关于“什么对性能最好”,但也有点“哲学上”的意思(如果有影响的话)......所以让我们直接进入。

[TableA].[ColumnB] 存储一个需要存在于 [TableC].[ColumnD] 中的值。马上,没有涉及外键的答案 - 只是假设它们在这种环境中是“不允许的”,无论出于何种原因。

但是由于“情况 x,y,z”,[TableA].[ColumnB] 有时会得到 [TableC].[ColumnD] 中不存在的值,因为,比方说,[TableA] 是从在运行代码中作为“序列化 blob”存在的对象,数据的内存表示,并且 [ColumnB] 值在这些值被其他进程从 [TableC].[ColumnD] 删除之前填充。无论如何,这是为了举例,所以不要陷入“为什么会发生这种情况”,只要接受它就会发生。

要“解决”问题,这两种方法中哪种方法最好: 1. 在 [TableA] 上创建一个触发 on-INSERT 的触发器,将 [ColumnB] 更新为它应该是的值(假设我有坏值到好值的“映射”)。或者,2. 每隔一小时/一分钟/无论运行更新查询的任何时间运行一个计划作业,以将所有可能的“坏”值更改为它们相应的“好”值。

更一般地说,什么对性能更好和/或什么是最佳实践:触发器还是定期计划作业?在上下文中,假设 [TableA] 通常大约有数十万行,插入一次发生 10-100 条记录,频率为每隔几分钟到每天几次。

【问题讨论】:

  • 谢谢大家!触发它是......我对在 20 多个不同的数据库上创建一个并不兴奋,但是,这就是生活。

标签: sql sql-server performance triggers


【解决方案1】:

插入时。

执行触发器就像回调 - 它们在逻辑上更合理,并且它们将任何延迟分散到每个查询中。进行持续检查(称为轮询或 cron-jobs)时,您会时不时地遇到更严重的滞后时刻。在几乎所有情况下,使用触发器/回调是更好的方法,因为在每个查询中添加 1 毫秒的延迟要比以看似随机的间隔增加 100 毫秒的延迟要好。

【讨论】:

    【解决方案2】:

    触发器既是最佳性能又是最佳实践,因为它们保持引用完整性并允许服务器针对性能进行优化。

    【讨论】:

      【解决方案3】:

      通常不鼓励使用触发器,但您的负载很轻,而且您的案例似乎是一个自然的触发器案例。考虑使用而不是触发器来避免对同一行进行两次操作(一次插入而不是插入和更新)。它可能是最简单最可靠的解决方案(只要你在触发器中编写了可靠的代码,不会导致整个操作崩溃)。

      由于您正在考虑批处理作业,因此您不必担心时间问题。即,您的应用程序可以在 1 分钟甚至 1 小时内不同步表。这是与触发器方法的主要区别,它将保证表始终保持同步。潜在的时间问题会让我感到不舒服。从好的方面来说,您不会面临使用触发器导致原始插入操作崩溃的风险。

      如果您走这条路,请考虑更改跟踪功能。更改跟踪将指示自上次检查以来已插入哪些行,因此您不必扫描整个表以查找新记录。或者,如果您的 TableA 有一个 INDENITY 主键或唯一键,您可以实现类似的设计,而无需更改跟踪功能。

      【讨论】:

        【解决方案4】:

        您没有说明您使用的是什么版本的 SQL Server,但如果是 2008+,您可以使用 Change Data Capture 来跟踪您的“主”表的数据更改。然后,您可以定期在更改表上运行批处理,并对该小集合执行所需的任何处理。

        【讨论】:

        • 看起来很有趣;不幸的是,服务器仍然是 SQL 2005。我很抱歉最初没有包括那个:)
        猜你喜欢
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多