【发布时间】:2011-05-25 12:10:37
【问题描述】:
我有一个表,其中包含对查看我的应用程序的用户没有用的部分数据。查看者希望看到一个类似的表,其中计算出所有值,并希望能够快速查询该数据。通常,这将是使用视图的理想场所。不幸的是,计算的复杂性限制了我对视图的使用,所以我需要一个替代解决方案。我正在考虑做类似以下的事情......
表 A 包含后端数据。每当更新此表时,都会触发一个触发器来更新表 B,该表显示了这些计算的结果。此时可以快速查询表B。
我唯一担心的是计算过程有些冗长,而且表 A 有可能会爆发多次更新。是否有任何类似于“选择前”触发器的解决方案?所以基本上A表可以连续多次更新,但是只有查询B表时才会计算?
这是一个示例时间线:
- 表 A 已更新
- 表 A 再次更新 [不要运行 SP,因为还没有人需要表 B 数据]
- 从表 B 请求数据[在获取数据之前运行 SP 以更新表 B]
- 表 A 已更新
- 从表 B 请求数据[在获取数据之前运行 SP 以更新表 B]
- 从表 B 请求数据[不要运行存储过程,因为表 A 在请求表 B 数据之间没有更新]
所以我的问题是:
- 有没有像我上面描述的那样存在?
- 如果没有,有没有办法让触发器延迟到完成一批更新/插入?表 A 不会经常修改,所以当它更新时我可以忍受一个缓慢的触发器。唯一的问题是,当表 A 确实更新时,通常一次有数百行,我不希望每次都运行缓慢的触发器。
感谢您提供任何解决方案/见解!
编辑 - 详细说明为什么(我认为至少)触发器实现会很慢:
- 将发送更新/插入/删除语句的应用程序正在使用 LINQ-to-SQL,这对于批处理操作并不是特别好。所以如果我想删除一堆记录,它会发送一堆删除语句而不是批量删除语句。有没有办法对删除语句进行分组并在此之后运行触发器? (也许我在这里离题太远了)。
- 我所说的“计算”涉及一些递归函数和一些决策过程。我实际处理的数据是调度数据。所以表 A 包含可能有也可能没有预定开始的任务。如果没有定义预定开始,它必须从其前身预定开始 + 其前身持续时间派生。在某些情况下,前任可能也没有该信息,因此递归查询会不断挖掘直到找到结果。它的速度并不慢,但如果它必须在每次插入/更新/删除时运行,它就会到达那里。我上面提到的“表 B”基本上是同一个表,但它已经包含了计算好的计划开始数据(需要在表 A 更新时更改)。
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql triggers