SqlDependency性能

Joh*_*hna 7 sql-server triggers polling sqlperformance sqldependency

我有一个Web应用程序,它使用与其他Web应用程序共享的SQL Server数据库(我无法控制).我必须知道任何Web应用程序何时对数据库中的某些表进行更改.

我的第一个想法是使用SqlDependency(具体来说SqlTableDependency,因为我需要知道更改的数据),但我担心性能问题.

我想知道是否有任何性能比较SqlDependency(非SqlTableDependency),触发器(触发WS,exe等)和轮询.

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

其他信息:

  • 要监控的五个表
  • 每张桌子每秒约有1次更改
  • 表每天增长约100行

谢谢!

小智 7

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


SqlDependency 与 SqlTableDependency 和触发器

尽管SqlDependencySqlTableDependency名称相似,但实现两者的行为和结果却大不相同。与 不同SqlDependencySqlTableDependency使用其他数据库对象补充 Queue,即目标表上的触发器。

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

诸如此类的砖墙使我实施了SqlTableDependency. 从文档中可能无法立即清楚的是,它会SqlTableDependency在 Start() 上自动填充数据库对象。所以我们不必花时间编写 Sql 过程。这里的主要免责声明是,您的 DBA 不仅必须启用 DB 代理,还必须拥有创建和删除触发器的权限。必须小心 Stop() aSqlTableDependency否则必须从数据库中手动清除触发器。如果你想保证糟糕的性能,在一张桌子上留下几十个触发器!不仅您的通知需要更长的时间,而且任何查询表以获取数据的人都会遇到速度变慢的情况。

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

以下是SqlTableDependency文档中对性能的简要提及:

负载测试和性能 SqlTableDependency 支持由每 50 毫秒执行一次的 DML 触发的通知。使用两个客户端应用程序在同一个表上同时执行 10.000 次随机插入/更新/操作实现的测试。(https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency


轮询

可以设置一项服务来轮询要监控的 5 个表中的每一个。但是,根据我们是否需要在每次更改中处理数据,或者我们是否只需要知道某些内容发生了变化,我估计处理来自轮询的数据会以如此严重的频率(据您估计每秒 1 次)变得麻烦。


推荐

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

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


Chr*_*nco 5

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

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

在此处输入图片说明

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