2012-04-18 34 views
1

我的问题主要关注“什么是最好的表现”,但有点“哲学”说话(如果它有所作为)......所以让我们跳吧[TableA]。[ColumnB]存储需要存在于[TableC] [ColumnD]中的值。 没有涉及外键的答案 - 只是假设他们在这种环境中“不允许”出于任何原因。因为“情况x,y,z”,[TableA]。[ColumnB]有时会得到[TableC]。[ColumnD]中不存在的值,因为假设[TableA]从一个存在于运行代码中的对象作为“序列化blob”,数据的内存中表示形式以及[ColumnB]值在从[TableC]。[ColumnD]被其他进程删除之前被填充。无论如何,这只是一个例子,所以不要陷入“为什么会发生这种情况”,只是接受它而已。SQL Server - 插入触发器与每分钟作业

要“解决”问题,哪种方法最适合这两种方法:1.在[TableA]上触发on-INSERT的Trigger,将[ColumnB]更新为它应该的值(并假设I有一个“坏到好”值的“映射”)。或者,2.每小时/分钟/运行一个计划任务更新查询以将所有可能的“坏”值更改为其相应的“良好”值。

更一般地说,有什么更好的性能和/或什么是最佳实践:触发器或定期预定作业?在上下文中,假设[TableA]的数量通常在数十万行的数量级上,Inserts每次发生10-100条记录,每隔几分钟一次,甚至每天几次。

+0

谢谢大家!触发它......我不兴奋地在20多个不同的DB上创建一个,但是,这就是生活。 – NateJ 2012-04-18 17:29:46

回答

9

插入。

做触发器就像回调 - 它们在逻辑上更合理,并且将任何滞后扩展到每个查询中。做不断的检查(称为轮询或定时任务),最终会出现更严重的滞后时间。在几乎所有情况下,使用触发器/回调函数都是更好的方法,因为在看似随机的时间间隔内,添加到每个查询的滞后时间为1毫秒比滞后100毫秒要好。

1

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

1

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

由于您正在考虑批量作业,因此您不关心计时问题。即,对于您的应用程序来说,表格可能在1分钟甚至1小时内不同步。这是触发器方法的主要区别,它将保证表格始终保持同步。潜在的时间问题会让我感到不舒服。从好的一面来看,您不会有触发器触发原始插入操作的风险。

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

0

你没有说你正在使用的是哪个版本的SQL Server,但是如果它是2008+,你可以使用Change Data Capture跟踪你的“主”表的数据变化。然后,定期地,您可以在变更表上运行一个批处理,并在该小处执行所需的任何处理。

+0

看起来有趣;不幸的是,服务器仍然是SQL 2005。我的道歉不包括原本:) – NateJ 2012-04-18 17:27:08