查询通知内部
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 链接的文章解释相同,但将其留在这里作为未来参考的答案。
我正在考虑使用 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 链接的文章解释相同,但将其留在这里作为未来参考的答案。