加载多个大型ADO.NET DataTables / DataReader - 性能改进

时间:2012-11-23 16:30:37

标签: c# sql-server vb.net ado.net

我需要从SQL Server将多个sql语句加载到DataTables中。大多数语句返回大约10.000到100.000条记录,每条记录最多需要几秒钟才能加载。 我的猜测是,这仅仅是由于需要推送的数据量。这些陈述本身并不需要花费太多时间来处理。

所以我尝试使用Parallel.For()并行加载数据,希望整体处理时间会减少。我的性能提升了10%,但这还不够。原因可能是我的机器只是双核心,因此限制了这里的好处。部署程序的服务器有16个核心。

我的问题是,如何才能更好地提高性能?使用异步数据服务查询是否比PLINQ更好的解决方案(BeginExecute等)?或者也许是其他方法?

SQl Server在同一台计算机上运行。部署服务器也是如此。

编辑: 我使用DataReader而不是DataTable运行了一些测试。这已使负载时间减少了约50%。大!我仍然想知道如果使用多处理器机器,使用BeginExecute进行并行处理是否会改善总体加载时间。有没有人有这方面的经验?感谢您的帮助!

更新: 我发现通过处理sql语句消耗了大约一半的加载时间。在SQL Server Management Studio中,语句只花费了一小部分时间,但不知何故,它们通过ADO.NET花费的时间更长。因此,通过使用DataReaders而不是加载DataTables并调整sql语句,我已经下降到初始加载时间的大约25%。使用Parallel.For()在并行线程中加载DataReader在这里没有改进。所以现在我对结果感到满意,并将其留在那里。也许当我们更新到.NET 4.5时,我会给asnchronous DataReader加载一次尝试。

3 个答案:

答案 0 :(得分:1)

  

我的猜测是,这仅仅是因为需要推送的数据量。

不,这是由于使用了SLOW框架。在我的一个应用程序中,我在不到5秒的时间内将近百万行拖入字典中。 DataTables很慢。

答案 1 :(得分:1)

你必须改变问题的本质。说实话,谁需要每个请求查看10.000到100.000条记录?我想没有人。

您需要考虑处理分页,在您的情况下,应该在sql server上进行分页。为了清楚说明,假设您有一个名为“GetRecords”的存储过程。修改此存储过程以接受页面参数,并仅返回与特定页面相关的数据(仅表示100条记录)和总页数。内部应用程序只显示这100条记录(它们将飞行)并处理选定的页面索引。

希望这有帮助,最好的问候!

答案 2 :(得分:0)

您经常需要加载这些请求吗?如果是这样,为什么不使用分布式缓存?