C#+ SQL Server - 将新行读入内存的最快/最有效的方法

时间:2011-01-20 23:22:53

标签: c# sql-server triggers

我有一个SQL Server 2008数据库,我正在使用C#4.0和Linq to Entities类设置数据库交互。

存在一个在DateTime列上编制索引的表,其中值是行的插入时间。一秒钟添加几个新行(~20),我需要有效地将它们拉入内存,以便我可以在GUI中显示它们。为简单起见,我只想说明我需要在通过WPF显示的列表中显示最新的50行。

我担心负载轮询可能会放在数据库上,以及处理新结果所需的时间迫使我成为一个缓慢的消费者(陷入积压的背后)。我希望对方法提出一些建议。我正在考虑的是那些;

  1. 以紧密循环方式轮询数据库(每个查询约1个结果)
  2. 每秒轮询数据库(每个查询约20个结果)
  3. 为插入创建数据库触发器并将其绑定到C#中的事件(SqlDependency
  4. 我也有一些访问选项;

    1. Linq-to-Entities表选择
    2. 原始SQL查询
    3. Linq-to-Entities存储过程
    4. 如果你能说明利弊,或者完全建议另一种方式,我很乐意听到它。

      将行添加到表中的过程不在我的控制之下,我希望只读取永远不会修改或添加的行。最重要的是不要重载SQL Server,保持GUI最新和响应,并尽可能少地使用内存...你知道,基础知识;)

      谢谢!

4 个答案:

答案 0 :(得分:0)

您可以使用SQL Server服务代理并从那里执行读取,甚至可以推送哪些行是新的,而不是轮询数据库。然后你可以从表中选择。

我在这里看到的最重要的事情是在识别新行的方式上有一个索引(时间戳?)。这样,您的查询将从索引中选择顶部条目,而不是每次查询表。

测试,测试,测试!根据您想要尝试的任何策略对您的表现进行基准测试。要解决的最大问题是如何存储数据以及您需要处理的任何锁定和一致性问题。

答案 1 :(得分:0)

如果你的表每秒更新20行,那么没有什么比每秒或每几秒更好的了。只要您有一种可以检索插入的最后行的有效方式(意味着索引或聚簇索引),此方法将消耗最少的资源。

如果更新发生在每秒20次更新的突发中,但中间有很长一段时间不活动(分钟),则可以使用SqlDependency(完全与触发器无关,顺便说一下,阅读{{3}对于udneratand它实际上是如何工作的)。您可以将LINQ与SqlDependency混合使用,请参阅The Mysterious Notification

答案 2 :(得分:0)

要查询以获得新数据的通知吗?

您可能最好使用服务总线的推送通知(例如:NServiceBus)。

使用通知(即事件)几乎总是比使用轮询更好的解决方案。

答案 3 :(得分:0)

我在这里参加派对有点晚了,但是如果你的SQL Server 2008版本有这个功能,那么有一个称为Change Data Capture的功能可能有所帮助。基本上,您必须为数据库和需要捕获的特定表启用此功能。内置的Change Data Capture进程查看事务日志,以确定对表进行了哪些更改,并将它们记录在预定义的表结构中。然后,您可以查询此表或将表中的结果拉成更友好的东西(可能在另一台服务器上?)。我们处于将此功能用于特定业务需求的早期阶段,到目前为止似乎运行良好。

您必须测试此功能是否能满足您的速度需求,但它可能有助于维护,因为不需要触发器,数据捕获也不会占用数据库表本身。