【问题标题】:Query Notification Internals查询通知内部
【发布时间】:2019-01-07 17:28:01
【问题描述】:

我正在研究使用Query Notifications 作为一种轻量级的方法来识别表中的数据何时发生变化。我知道他们使用 Service Broker,并且(尽管我很难解释确切原因)他们看起来确实比 CDC 或 Triggers 之类的东西更可取。

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

对我来说,这听起来就像他们在说你给它的任何查询,都会一遍又一遍地运行。我想我可能误解了 SQL 在该查询的幕后究竟做了什么来监控所说的变化,但我在网上找不到任何关于实际发生的事情。我希望它类似于解析查询并在查询中引用的任何对象上设置超级轻量级​​“触发器”,但由于我不知道,这让我不愿使用该功能。

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

【问题讨论】:

  • 这篇文章可能会有所帮助。 web.archive.org/web/20090426220055/http://rusanu.com/2006/06/17/… 虽然显示执行计划的图片太小而无法阅读,并且原始图像不再可用。但是您可以设置自己的测试
  • 为什么不使用触发器,将数据更改存储到表格中并用 PHP 或其他语言打印出来?
  • @AlvaroParra 有很多原因,但无关紧要,因为这不是我在这里感兴趣的。
  • @MartinSmith 谢谢;现在阅读那篇文章。

标签: sql-server queue sql-server-2014 service-broker


【解决方案1】:

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

这就是为什么查询可以订阅 QN 的限制与索引视图限制几乎相同的原因。

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

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多