这是场景:
我正在处理带有存储过程的 SQL Server 数据库,该存储过程负责返回 Web 提要项目 (RSS/Atom) 的标头,我通过 Web 应用程序作为提要。
此存储过程应在由以给定间隔运行的服务代理任务调用时验证基础数据是否发生重大变化 - 在这种情况下,它将触发资源密集型活动,通过调用将获取/检索数据、格式化数据并返回 SQL 数据库的 Web 应用程序。
那里将存储标头以准备好从客户端请求 RSS 提要更新。
现在,试图将其设计为尽可能高效,我仍然有几个转折点希望得到您的建议。
我对存储过程的暂定方法是:
- 在内存表中收集数据,
- 创建一个带有随信息变化的签名列的子查询,
- 使用 FOR XML AUTO 将它们转换为 XML
- 使用 MD5 对结果进行散列(使用 HASHBYTES 或 fn_repl_hash_binary,具体取决于结果的大小)
- 验证哈希是否与存储在我正在存储等待提要请求的 HTML 的表中的哈希匹配。
- 如果哈希匹配不执行任何操作,否则继续进行更新。
第一个疑问是检查基础数据是否已更改的最佳方法。
转换为 XML 会显着增加数据 - 这会减慢散列速度 - 并且可能除了散列之外我没有使用结果:有没有更好的方法来执行检查或将所有数据打包在一起以进行散列(类似于 csv 的东西)?
该查询正在合并和聚合来自多个表的数据,因此不会依赖表时间戳,因为它们的更改不一定与结果集中的更改有关
第二点是:将数据提供给 webapp 进行重新格式化的最佳方式是什么? - 我可能会通过 CLR 函数将数据推送到 Web 应用程序以格式化数据(但这是同步的,并且对于多个提要项会产生不可持续的延迟)
或者
我可能会改为保存结果集并通过服务代理触发多个异步调用。Web 应用程序可能会检索以某种方式存储的数据,而不是再次运行获取它们的昂贵查询。
由于根据提要项目类别我有不同的格式,我不能使用相同的表格格式 - 所以存储到表格中会很困难。
我可能会序列化为 XML。
但是,与重新运行查询相比,这会提供任何显着的收益吗?