我正在考虑使用Query Notifications作为一种轻量级的方法来标识表中的数据何时发生更改。我知道他们使用Service Broker,而且(尽管我很难解释确切的原因)他们看起来确实比CDC或触发器之类的东西更可取。
查询通知是通过向数据库提供查询来设置的,该查询将发送一个通知"[...when the results of the provided query change](https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms175110(v=sql.105%29)".
对我来说,这听起来像是他们在说,无论你给它什么查询,都会一遍又一遍地运行。我想我可能误解了SQL在幕后对该查询所做的工作,以监视所说的更改,但我在网上找不到任何关于实际发生的事情。我希望它类似于解析查询,并在查询中引用的任何对象上设置超级轻量级的“触发器”,但由于我不知道,它让我不想使用这个功能。
是否有人足够熟悉Service Broker和查询通知功能来解释数据库引擎如何监视所提供查询中的更改?
发布于 2019-01-08 03:10:27
基于与物化(索引)视图相同的技术。当您为查询"Select ... from .... where“设置一个QN时,引擎会使用相同的查询设置一个假的索引视图。无论何时运行任何DML,执行计划都必须维护“伪”索引视图数据,并相应地生成计划。当(如果) DML执行实际尝试更新伪索引视图中的行时,这是一个迹象,表明原始查询可能已经更改了结果,并触发了通知。然后删除“伪”索引视图。针说,‘假的’索引视图永远不会物化(没有实际的行存在)。
这就是查询可以订阅QN的限制几乎与索引视图限制相同的原因。
Martin链接的文章对此进行了同样的解释,但将本文留在这里作为未来参考的答案。
https://stackoverflow.com/questions/54079051
复制相似问题