我的问题主要是关注“什么是表现最佳”,但也有点“哲学”说话(如果它有所作为)......所以让我们直接进入。
[TableA]。[ColumnB]存储[TableC]中需要存在的值。[ColumnD]。马上,没有涉及外键的答案 - 只是假设他们因为某种原因在这种环境中“不被允许”。
但是由于“情况x,y,z”,[TableA]。[ColumnB]有时会得到[TableC]中不存在的值。[ColumnD],因为,比方说,[TableA]从一个填充作为“序列化blob”存在于运行代码中的对象,数据的内存中表示,并且在通过某些其他进程从[TableC]。[ColumnD]中删除这些值之前填充[ColumnB]值。无论如何,这是为了举例,所以不要陷入“为什么会发生这种情况”,只要接受它。
要“解决”问题,哪种方法最适合这两种方法:1。在[TableA]上创建一个触发on-INSERT的触发器,将[ColumnB]更新为它应该的值(并假设我有不良价值的“映射”。或者,2。每小时/每分钟运行一个预定作业/运行任何更新查询,将所有可能的“坏”值更改为相应的“好”值。
更普遍的说法是,什么是更好的性能和/或什么是最佳实践:触发器,或定期的预定作业?在上下文中,假设[TableA]通常在数十万行的数量级上,插入一次发生10-100条记录,每隔几分钟发生一次,每天发生几次。< / p>
答案 0 :(得分:9)
在嵌件。
执行触发器就像回调一样 - 它们在逻辑上更合理,并且它们会在每个查询中传播任何延迟。进行连续检查(称为轮询或计算机作业),您不时会遇到更严重的延迟时刻。在几乎所有情况下,使用触发器/回调是更好的方法,因为在每个查询中添加1ms的滞后优于看似随机间隔的100ms滞后。
答案 1 :(得分:1)
触发器是最佳性能和实践,因为它们保持参照完整性,并允许服务器优化性能。
答案 2 :(得分:1)
通常不鼓励使用触发器,但是你的负载很轻,你的情况似乎是一个自然的触发器案例。考虑使用替代触发器来避免同一行上的两个操作(一个插入而不是插入和更新)。它可能是最简单,最可靠的解决方案(只要您在触发器中编写了可靠的代码,不会导致整个操作崩溃)。
由于您正在考虑批处理作业,因此您不关心计时问题。即您的应用程序可以使表格在1分钟甚至1小时内不同步。这是触发器方法的主要区别,它将保证表始终保持同步。潜在的时间问题会让我感到不舒服。从好的方面来说,您不会有使用触发器导致原始插入操作崩溃的风险。
如果您选择此路线,请考虑更改跟踪功能。更改跟踪将指示自上次检查以来已插入的行,因此您不必扫描整个表以获取新记录。或者,如果您的TableA具有INDENITY主键或唯一键,则可以实现类似的设计而无需更改跟踪功能。
答案 3 :(得分:0)
您没有说出您使用的是哪个版本的SQL Server,但如果它是2008+,您可以使用Change Data Capture来跟踪“主”表的数据更改。然后,您可以定期在更改表上运行批处理,并对该小集执行任何必要的处理。