C# 加载多个大型ADO.NET数据表/数据读取器-性能改进

C# 加载多个大型ADO.NET数据表/数据读取器-性能改进,c#,sql-server,vb.net,ado.net,C#,Sql Server,Vb.net,Ado.net,我需要将多个sql语句从sql Server加载到数据表中。大多数语句返回大约10.000到100.000条记录,每个记录的加载时间长达几秒钟。 我的猜测是,这仅仅是由于需要处理的数据量。这些语句本身不需要花很多时间来处理 因此,我尝试使用Parallel.For()并行加载数据,希望总体处理时间能够减少。我确实得到了10%的性能提升,但这还不够。一个原因可能是我的机器只是一个双核,因此限制了这里的好处。不过,部署程序的服务器有16个核心 我的问题是,我如何才能更好地提高性能?使用异步数据服务查

我需要将多个sql语句从sql Server加载到数据表中。大多数语句返回大约10.000到100.000条记录,每个记录的加载时间长达几秒钟。 我的猜测是,这仅仅是由于需要处理的数据量。这些语句本身不需要花很多时间来处理

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

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

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

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

更新:
我发现大约一半的加载时间被sql语句所占用。在SQLServerManagementStudio中,这些语句只花费了一小部分时间,但不知何故,它们通过ADO.NET花费的时间要长得多。因此,通过使用DataReader而不是加载DataTables并调整sql语句,我已经将初始加载时间减少到了25%左右。使用parallel.For()在并行线程中加载DataReader在这里并没有任何改进。所以现在我对结果很满意,就这样吧。也许当我们更新到.NET 4.5时,我会尝试一下asnchronous DataReader的加载。

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

我的猜测是,这仅仅是由于需要处理的数据量


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

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

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


希望这有帮助,祝你好运

请展示一些源代码…加载1000条记录总是一个很好的机会,这是一个糟糕设计的标志。。。(除非你这样做是为了缓存)并描述你的用例。。。数据需要多及时?您有哪些缓存选项?您能否限制需要加载的元素,从而减少网络流量?你能优化你的服务器端数据库以方便查询吗?我正在写一个搜索引擎。我已经缓存了最大的结果,但这并不能真正解决问题,因为用户可以搜索任何内容。基本上,由于用户等待搜索结果,因此需要尽快返回数据。我已经缓存了最大的结果,但这并不能真正解决问题,因为用户可以搜索任何内容。将它们加载到字典中对我来说很好。无论如何,我不使用数据表进行额外的处理。如果有另一种方式来加载这些,那就太好了!好吧,那就做吧。我使用BlToolkit作为轻型ORM,并将它们放入字典中。数据表是处理数据最慢的方式。将数据放入对象,加载它们。感谢您的建议!我看过BIToolkit的源代码,它使用DataReader本身将数据加载到字典或列表中。我的查询可能比您的查询要长一点,因为我读了很多包含字符串数据的列。也许我现在不会比使用DataReader更快。或者,如果我并行加载多个数据读取器,可能仍然如此。但这似乎只有在.NET4.5中得到了很好的支持。我仍在使用.NET4.BlToolkit,但编程速度会快得多——这就是金钱,直接和直接(花费的时间更少)。这就是为什么使用ORM的原因-在.NET中没有任何东西最终不使用DataReader。每个请求提取10.000多行是有充分理由的,特别是当您进行进一步处理时。我定期处理数百万行数据集。汤姆:我不同意你的观点。在asp页面请求中设置10k-100k行会降低性能。我们不是现在就谈这个吗!?此外,sql server端的数据操作要比.net应用程序内部的数据操作有效得多。我对请求进行了大量的进一步处理,最终结果确实是分页的。我已经完成了所有可以想象的sql端优化,但是源表有1000万条记录。是的,我可以用T-SQL重写整个过程。但那将是多么痛苦。另一种解决方案是在SQL Server CLR中执行整个处理(将程序集加载到数据库中)。尽管如此,这仍然是一个重大的重新设计,我希望避免这种情况。@GregorPrimar好吧,可能是在ASP.NET页面上,但我确实编写了处理网格中数百万行的软件。当你将3年5秒的数据可视化以便快速水平滚动时-是的,那是很多行。开始对它进行数学分析,写出结果——是的,我们谈论的是千兆字节的数据。