SqlDependency 性能

SqlDependency performance

我有一个使用 SQL 服务器数据库的 Web 应用程序,该数据库与其他 Web 应用程序共享(我无法控制)。我必须知道任何 Web 应用程序何时对数据库中的某些 table 进行了更改。

我的第一个想法是使用SqlDependency(特别是SqlTableDependency,因为我需要知道更改后的数据),但我担心性能问题。

我想知道是否有关于 SqlDependency(不是 SqlTableDependency)、触发器(触发 WS、exe 等)和轮询的性能比较。

我找到了一些问题和文章,但对我来说还不够清楚

其他信息:

谢谢!

简短的回答是......可能有太多移动部分无法在实施之前直接比较性能。我将谈论性能,但在这里发挥作用的是确定哪些选项满足我们应用程序的基本需求。


Sql依赖与 SqlTableDependency 和触发器

虽然 SqlDependency and SqlTableDependency 在名称上相似,但实施两者的行为和结果却大相径庭。与 SqlDependency 不同,SqlTableDependency 用其他数据库对象补充队列,即目标 table 上的触发器。

在我的应用程序中,它处理从服务器到客户端的 SignalR 消息传递,SqlDependency 是一个 非启动器 因为它本身不提供我需要从数据库更改中读取的实时数据。平心而论,它不是这样设计的。任何数据都将从单独的数据库调用中获取。因此,任何效率或感知速度实际上都被抵消了。如果数据变化足够频繁,并且没有足够的解决方法,在变化通知后立即调用过程可能甚至无法取回我们正在寻找的数据。

诸如此类的砖墙让我实现了 SqlTableDependency。从文档中可能无法立即清楚的是 SqlTableDependency 在 Start() 上自动填充数据库对象。所以我们不必花时间创作 Sql 过程。这里的主要免责声明是,您的 DBA 不仅必须启用 DB 代理,还必须具有创建和删除触发器的权限。必须小心 Stop() a SqlTableDependency 否则必须从数据库中手动清除触发器。如果你想保证性能不佳,请在 table 上留下几十个触发器!不仅您的通知会花费更长的时间,而且任何查询 table 数据的人都会遇到减速。

话虽这么说,我们只需要一个 SqlTableDependency 触发器就可以向数千个客户端发送消息或向尽可能多的服务发送数据。从这个角度来看,我认为它是高效的。

以下是 SqlTableDependency 文档中对性能的简要介绍:

Load Test and Performance SqlTableDependency support notifications triggered by DML executed every 50 milliseconds. Test realized with two client applications concurrently executing 10.000 random insert/update/operation on same table.(https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency)


轮询

可以设置一个服务来轮询 5 个 table 中的每一个以进行监视。但是,根据我们是否需要处理每次更改中的数据,或者我们是否只需要知道发生了某些更改,我估计处理来自轮询的数据会变得很麻烦,频率如此之高(据您估计为每秒 1 次)。


推荐

在时间允许的情况下创建尽可能多的实现并观察每个实现的行为。有些人会在任何负载测试之前将自己排除在外。 SqlTableDependency 是一个坚实的起点。

每种方法都有一个独特的实现,因此性能晴雨表必须说明支持代码和数据环境如何影响整体情况。

正如 MTADEV 正确告知的那样“也就是说,我们只需要一个 SqlTableDependency 触发器就可以向数千个客户端发送消息或向尽可能多的服务发送数据。从这个角度来看,我会将其定性为高效。".

当您需要在多个客户端上发送通知更改时,您必须创建一个包含 SqlTableDependency 的中央服务。 SqlTableDependency 传递的每个通知都将由该服务管理,该服务将通知其他客户端:

请看:https://stockprices.codeplex.com/