Sql 使用触发器是否是此场景的最佳解决方案

Sql 使用触发器是否是此场景的最佳解决方案,sql,performance,stored-procedures,triggers,Sql,Performance,Stored Procedures,Triggers,一个大型SQL事务数据库有100多个表(而且它还会增长)。其中一个称为顺序。然后,还有另一个表WorkLoad,它派生自Order,还有许多其他关联表,其中包含所有活动订单的列表。每次创建订单记录时,如果它满足某些条件,则应立即将其插入到工作负载表中。最后,还有第三个表WorkLoad Aggregation,它显示按日期和店铺分组的聚合数据,它完全是从WorkLoad表构建的。WorkLoadAggregation还应显示实时数据,这意味着如果在WorkloadTable中插入记录,则还应更新

一个大型SQL事务数据库有100多个表(而且它还会增长)。其中一个称为顺序。然后,还有另一个表WorkLoad,它派生自Order,还有许多其他关联表,其中包含所有活动订单的列表。每次创建订单记录时,如果它满足某些条件,则应立即将其插入到工作负载表中。最后,还有第三个表WorkLoad Aggregation,它显示按日期和店铺分组的聚合数据,它完全是从WorkLoad表构建的。WorkLoadAggregation还应显示实时数据,这意味着如果在WorkloadTable中插入记录,则还应更新匹配的日期/车间聚合

我的想法是通过以下触发器来处理此问题:

  • 当记录插入到订单表中时,触发器调用存储过程,该存储过程将记录插入到工作负载表中
  • 删除订单记录时,触发器从工作负载表中删除记录
  • 当订单记录以不满足工作负载条件的方式更新时,触发器将从工作负载表中删除该记录
  • 当记录在WorkLoad表中插入/删除/更新时,触发器调用存储过程,该存储过程更新WorkLoad聚合表中匹配的日期/车间聚合记录
  • 我还没有在如此大的事务数据库和如此频繁的调用中使用过那么多触发器。这种方法有什么不好的地方吗?我最担心的是“链式触发器”的使用,这意味着一个表上的触发器激活另一个表上的触发器。我读过几篇文章,其中指出开发人员在使用触发器时应该非常谨慎。有没有更好的解决办法?我应该考虑任何NoSQL解决方案吗?< /P> 数据库托管在SQL Server 2012上


    注意:在案例5)中,调用的存储过程包含一个CTE(如果有人建议使用索引视图)

    要提供更具体的意见有点困难,但要基于问题空间的表示。我不推荐这种解决方案,因为它很难进行有效的测试,而且我可以看到在高负载情况下这会导致问题。另外,很难量化总体影响,因为我不确定读取负载会是什么样子,以及有多少其他进程可能需要这些表中的信息


    基于您对问题的描述,以及您询问NoSQL方法的事实,我认为最终的一致性不是一个很大的问题,因此我建议使用更为事件驱动的体系结构。请记住,这可能意味着对当前实现进行重大重写,但肯定会允许更好的区域分解和扩展

    如果使用触发器,请注意以下提示:触发器始终是触发触发器的事务的一部分,在触发器中使用回滚或提交时,或者在触发器中有显式事务时,请小心。我的意思是,如果您决定在这个场景中使用触发器,请仔细考虑并管理好事务,这是我认为的主要提示“我可以看到这会在高负载时导致问题”-什么类型的问题?