Sql 查看复杂数据的替代方案?

Sql 查看复杂数据的替代方案?,sql,sql-server,sql-server-2005,tsql,triggers,Sql,Sql Server,Sql Server 2005,Tsql,Triggers,我有一个表,其中包含对查看我的应用程序的用户没有用处的部分数据。查看器希望看到一个包含所有计算出的值的类似表,并希望能够快速查询该数据。通常,这是使用视图的最佳位置。不幸的是,计算的复杂性限制了我对视图的使用,因此我需要另一种解决方案。我正在考虑做如下的事情 表A包含后端数据。每当更新此表时,都会触发一个触发器来更新表B,表B显示这些计算的结果。此时可以快速查询表B 我唯一担心的是,计算过程有点冗长,表A有可能被多次更新。有没有类似于“选择前”触发器的解决方案?因此,表A基本上可以在一行中更新多

我有一个表,其中包含对查看我的应用程序的用户没有用处的部分数据。查看器希望看到一个包含所有计算出的值的类似表,并希望能够快速查询该数据。通常,这是使用视图的最佳位置。不幸的是,计算的复杂性限制了我对视图的使用,因此我需要另一种解决方案。我正在考虑做如下的事情

表A包含后端数据。每当更新此表时,都会触发一个触发器来更新表B,表B显示这些计算的结果。此时可以快速查询表B

我唯一担心的是,计算过程有点冗长,表A有可能被多次更新。有没有类似于“选择前”触发器的解决方案?因此,表A基本上可以在一行中更新多次,但计算只会在查询表B时发生

以下是一个时间线示例:

  • 表A已更新
  • 表A再次更新[不要运行SP,因为还没有人需要表B数据]
  • 从表B请求数据[在获取数据之前运行SP更新表B]
  • 表A已更新
  • 从表B请求数据[在获取数据之前运行SP更新表B]
  • 从表B请求数据[不要运行存储过程,因为在请求表B数据之间没有更新表A]
  • 因此,我的问题是:

  • 有没有像我上面描述的那样存在的东西
  • 如果没有,是否有办法使触发器推迟到完成一批更新/插入?表A不会经常被修改,所以当它被更新时,我可以忍受一个缓慢的触发器。唯一的问题是,当表A被更新时,它通常一次有数百行,我不希望每次都运行一个缓慢的触发器
  • 感谢您提供的任何解决方案/见解

    编辑-更详细地说明为什么(至少我认为)触发器实现会很慢:

  • 将发送Update/Insert/Delete语句的应用程序正在使用LINQ to SQL,这对于批处理操作不是特别好。因此,如果我想删除一组记录,它将发送一组delete语句,而不是batch delete语句。有没有办法将delete语句分组,然后让触发器运行?(也许我离主题太远了)
  • 我所说的“计算”涉及一些递归函数和一些决策过程。我实际处理的数据是调度数据。因此,表A包含的任务可能有计划的开始,也可能没有计划的开始。如果未定义计划启动,则必须从其前置计划启动+前置持续时间派生。在某些情况下,前置程序可能也没有这些信息,因此递归查询会一直挖掘,直到找到结果为止。它的速度并不慢,但如果必须在每次插入/更新/删除时都运行它,那么它就会到达目的地。我上面提到的“表B”基本上是同一个表,但它已经包含了计算的计划启动数据(需要在更新表A时更改)

  • 触发器操作插入或更新的整批记录,而不是一次操作一行

    如果计算时间太长,只有几百条新记录,那么计算本身可能需要进行性能调整

    如果您在触发器中进行计算,那么它们是每个事务的一部分,并且在允许另一个事务之前,它们将完成,因此可以想象这会降低插入速度。如果您正确地编写触发器来处理数据集,而不是一行一行地处理数据集,那么它可能不会引起问题。数百行对于大多数计算来说都是微不足道的。如果在批处理中插入数百万行,我更关心的是触发器性能会干扰其他进程

    您可以创建一个proc来执行计算,并将其计划为每十分钟左右运行一次,然后在调用报告时再次运行。通过这种方式,它可以提前完成大部分预计算,并在报告时捕获最后几条新记录

    给我们一个计算和潜在触发的示例,我们可以更好地帮助您


    如果单个事务进入一个组触发器运行,则无法将一组事务分组。也许你应该停止使用LINQ来处理这个问题,如果你需要批量处理的话,可以发送一个abatch语句。如果一次处理多条记录,则通常最好使用基于集合的操作。

    触发器操作插入或更新的整批记录,而不是一次一行

    如果计算时间太长,只有几百条新记录,那么计算本身可能需要进行性能调整

    如果您在触发器中进行计算,那么它们是每个事务的一部分,并且在允许另一个事务之前,它们将完成,因此可以想象这会降低插入速度。如果您正确地编写触发器来处理数据集,而不是一行一行地处理数据集,那么它可能不会引起问题。数百行对于大多数计算来说都是微不足道的。如果在批处理中插入数百万行,我更关心的是触发器性能会干扰其他进程

    您可以创建一个proc来执行计算,并将其计划为每十分钟左右运行一次,然后在调用报告时再次运行。通过这种方式,它可以提前完成大部分预计算,并在报告时捕获最后几条新记录

    给我们一个计算和潜在触发的示例,我们可以更好地帮助您

    如果单个事务进入一个组触发器运行,则无法将一组事务分组