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

C# C+SQL Server—将新行读入内存的最快/最有效的方法,c#,sql-server,triggers,C#,Sql Server,Triggers,我有一个SQLServer2008数据库,正在使用C4.0和LINQtoEntities类来设置数据库交互 存在一个在DateTime列上编制索引的表,其中的值是该行的插入时间。在第二个20秒内添加了几行新行,我需要有效地将它们拉入内存,以便在GUI中显示它们。为了简单起见,让我们假设我需要在通过WPF显示的列表中显示最新的50行 我关心的是数据库中可能出现的负载轮询,以及处理新结果所需的时间,这迫使我成为一个迟钝的消费者,陷入积压工作。我希望得到一些关于方法的建议。我正在考虑的是 在紧密循环中

我有一个SQLServer2008数据库,正在使用C4.0和LINQtoEntities类来设置数据库交互

存在一个在DateTime列上编制索引的表,其中的值是该行的插入时间。在第二个20秒内添加了几行新行,我需要有效地将它们拉入内存,以便在GUI中显示它们。为了简单起见,让我们假设我需要在通过WPF显示的列表中显示最新的50行

我关心的是数据库中可能出现的负载轮询,以及处理新结果所需的时间,这迫使我成为一个迟钝的消费者,陷入积压工作。我希望得到一些关于方法的建议。我正在考虑的是

在紧密循环中轮询数据库,每个查询1个结果 每秒轮询一次数据库,每次查询20个结果 为INSERT创建一个数据库触发器,并将其绑定到C中的事件 我也有一些访问的选择

Linq到实体表选择 原始SQL查询 Linq到实体存储过程 如果你能解释一下正反两方面的问题,或者提出完全不同的建议,我很乐意听你这么说

将行添加到表中的过程不在我的控制之下,我只希望读取不需要修改或添加的行。最重要的是不要让SQL Server过载,让GUI保持最新且响应迅速,并尽可能少地使用内存。。。你知道,最基本的


谢谢

您可以使用SQL Server Service broker从数据库执行读取,而不是轮询数据库,甚至可以推送哪些行是新的。然后您可以从表中进行选择

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


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

如果表以每秒20行的速度不断更新,那么每隔一秒或几秒拉一次就没有更好的方法了。只要您有一种有效的方法,即可以检索插入的最后一行的索引或聚集索引,此方法将消耗最少的资源

如果更新发生在每秒20次更新的突发事件中,但其间有相当长的不活动时间,那么您可以使用SqlDependency,它与触发器完全无关。顺便说一下,请阅读UDNERAN及其实际工作方式。您可以将LINQ与SqlDependency混合使用,请参阅

您是否必须查询才能收到新数据的通知

您最好使用来自服务总线的推送通知,例如:


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

我在这里参加聚会有点晚了,但是如果您的SQL Server 2008版本中有此功能,那么有一个称为的功能可能会有所帮助。基本上,您必须为数据库和需要捕获的特定表启用此功能。内置的变更数据捕获流程查看事务日志,以确定对表进行了哪些变更,并将其记录在预定义的表结构中。然后,您可以查询此表,或将表中的结果拉入到其他服务器上更友好的内容中?。我们正处于将此功能用于特定业务需求的早期阶段,到目前为止,它似乎工作得相当好


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

所有答案都很好,但我不知道此功能,并已在我的解决方案中使用。谢谢