繁体   English   中英

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

[英]C# + SQL Server - Fastest / Most Efficient way to read new rows into memory

我有一个SQL Server 2008数据库,并且正在将C#4.0与Linq to Entities类一起使用以进行数据库交互。

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

我担心负载轮询可能会放在数据库上,处理新结果将花费时间,这迫使我成为缓慢的使用者(陷入积压)。 我希望就此方法提出一些建议。 我正在考虑的是

  1. 紧密轮询数据库(每个查询约1个结果)
  2. 每秒轮询数据库(每个查询约20个结果)
  3. 为插入创建数据库触发器,并将其绑定到C#中的事件( SqlDependency

我也有一些访问选项。

  1. Linq到实体表选择
  2. 原始SQL查询
  3. Linq到实体存储过程

如果您可以了解利弊,或者完全建议另一种方式,我很想听听。

将行添加到表的过程不在我的控制下,我只希望读取行,而无需修改或添加。 最重要的事情是不要使SQL Server超载,保持GUI为最新并具有响应能力,并使用尽可能少的内存...您知道,基本知识;)

谢谢!

与其轮询数据库,不如可以使用SQL Server Service代理并从那里进行读取,甚至可以推送新的行。 然后,您可以从表格中选择。

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

测试,测试,测试! 根据您想尝试的任何策略来评估您的表现。 要解决的最大问题是数据的存储方式以及需要处理的所有锁定和一致性问题。

如果您的表以每秒20行的速度不断更新,则没有更好的方法可以每秒或每隔几秒钟进行一次拉动。 只要您有一种有效的方法(意味着索引或聚集索引)可以检索最后插入的行,则此方法将消耗最少的资源。

如果更新以每秒20次的突发速度进行更新,但之间有相当长的不活动时间(分钟),那么您可以使用SqlDependency(顺便说一下,它与触发器完全无关,请阅读The Mysterious Notification for udneratand how它确实有效)。 您可以将LINQ与SqlDependency混合使用,请参见linq2cache

是否需要查询以通知新数据?

使用来自服务总线(例如: NServiceBus )的推送通知可能会更好。

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

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

您将必须测试该功能是否可以满足您的需求,但是它可以帮助维护,因为不需要触发器,并且数据捕获不会占用您的数据库表本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM