查询通知内部

Query Notification Internals

我正在考虑使用 Query Notifications 作为一种更轻量级的方式来识别 table 中的数据何时发生变化。我知道他们使用 Service Broker,并且(虽然我很难解释到底为什么)他们看起来确实比 CDC 或触发器之类的东西更可取。

通过向数据库提供查询来设置查询通知,该查询发送通知“...when the results of [the provided] query change”。

对我来说,这听起来像是他们在说您提出的任何问题,都会 运行 一遍又一遍。我认为我可能误解了 SQL 在该查询的幕后所做的事情以监视所述更改,但我无法在网上找到任何关于实际发生的事情的信息。我希望它能解析查询并在查询中引用的任何对象上设置超级轻量级​​ "triggers",但由于我不知道,这让我不愿使用该功能。

是否有人足够熟悉 Service Broker 和查询通知功能来解释数据库引擎如何监视所提供查询中的更改?

基于与物化(索引)视图相同的技术。当您为查询 "Select ... from .... where" 设置 QN 时,引擎会使用相同的查询设置伪造的索引视图。每当您 运行 任何 DML 时,执行计划都必须维护 'fake' 索引视图数据并相应地生成计划。当(并且如果)DML 执行实际上尝试更新假索引视图中的行时,这是原始查询可能已更改结果并触发通知的标志。然后删除 'fake' 索引视图。不用说,'fake' 索引视图永远不会具体化(不存在实际行)。

这就是为什么什么查询可以订阅QN的限制和索引视图的限制几乎一样。

Martin 链接的文章解释相同,但将其留在这里作为未来参考的答案。